約 1,503,546 件
https://w.atwiki.jp/208sit/pages/94.html
Matilda IV Tier5 中戦車 Tier 5 名称 Matilda IV 評価 貫通力★★☆☆☆ 威力 ★★★☆☆ 精度 ★★★★☆ 耐久力★★★★★ 装甲 ★★★★☆ 機動性★★☆☆☆ おすすめ度 ★★★★☆ 所感 良い所:俯角が凄い(-14°)、マチルダ譲りの頼もしい装甲、優遇がある 悪い所:加速が悪い、砲が微妙に弱い まとめ:意外と強い
https://w.atwiki.jp/hosei-el/pages/31.html
HED ** LIST THE PROGRAM** LIST THE PROGRAM LIST LDB PBUFF INITIALIZE TO FIRST STB TEMPS STATEMENT OF PROGRAM JSB GETCR SEQUENCE NUMBER GIVEN? JMP LIST0 LDB .BUFA SET FOR STB SBPTR SEQUENCE NUMBER JSB INCHK,I YES, DEF MAXSN FETCH IT LDA .BUFA,I LOAD SEQUENCE NUMBER JSB FNDPS FIND INITIAL STATEMENT JMP RDYDA,I NOP SAVE STB TEMPS ADDRESS LIST0 CLB CPB STK18 CHECK PUNCH LAG JMP LIST1 NO LDA B133 YES, EMIT JSB WRITE,I LIST1 LDB TEMPS MORE CPB PBPTR PROGRAM? JMP LIS13 NO CCA INITIALIZE ADA SBUFA OUTPUT BUFFER STA BADDR POINTER CLA INITIALIZE STA CCNT CHARACTER COUNT LDA TEMPS,I OUTPUT JSB OUTIN SEQUENCE NUMBER LDA BLANK OUTPUT JSB OUTCR BLANK ISZ TEMPS FETCH LDA TEMPS,I STATEMENT LENGTH CMA,INA SET INA WORD STA STK5 LIST3 ISZ TEMPS MORE ISZ STK5 JMP LIST4 YES LIST2 LDB SBUFA OUTPUT LDA CCNT JSB WRITE,I JMP LIST1 LIST4 LDA TEMPS,I AND OPMSK SZA,RSS NULL OPERATOR? JMP LIST5 YES STA TEMP2 NO, SAVE OPERATOR ALF,ALF SINGLE ARS LDB 0 ADA M21 OPERATOR? SSA,RSS JMP LIS12 NO BLS INB ADB FOPBS LDA 1,I SYMBOL ALF,ALF ADJUST AND MSK0 CHARACTER CPA .34 QUOTE MARK? JMP LIS14 JSB OUTCR NO LIST5 LDA TEMPS,I AND OPDMK SAVE STA TEMP3 OPERAND AND TYPFL EXTRACT OPERAND TYPE STA LFLAG SET LFLAG FALSE SSA FLAG BIT SET? JMP LIST9 YES SZA,RSS NO, NULL OPERAND? JMP LIST3 YES CPA .15 FUNCTION? JMP LIST8 YES LIST6 ADA M5 SSA LETTER-DIGIT COMBINATION? JMP LIST7 NO CCA YES, SET STA LFLAG LFLAG FALSE LIST7 LDA TEMP3 ALF,ALF RESTORE AND ALF AND B177 OUTPUT ADA B100 JSB OUTCR LETTER ISZ LFLAG DIGIT FOLLOWS? JMP LIST3 NO LDA TEMP3 YES AND .15 RESTORE ADA .43 DIGIT JSB OUTCR OUTPUT DIGIT JMP LIST3 LIST8 LDA F OUTPUT JSB OUTCR F LDA N OUTPUT JSB OUTCR N JMP LIST7 LIST9 XOR FLGBT CLE,SZA NUMBER? JMP LIS10 NO ISZ TEMPS YES, STA SIGN SET SIGN FLAG FALSE LDA TEMPS,I ISZ TEMPS OUTPUT LDB TEMPS,I ISZ STK5 ISZ STK5 SSA NEGATIVE NUMBER? CCE YES, SET SIGN FLAG TRUE JSB NUMOA,I NOP JMP LIST3 LIS10 CPA .3 INTEGER? JMP LIS11 YES CPA .15 NO, FUNCTION? RSS YES JMP LIST6 NO, MUST BE A PARAMETER LDA TEMP3 COMPUTE ALF,RAL PRINT AND OPMSK TABLE STA TEMP2 CODE LDB ATAB JSB MCOUT OUTPUT FUNCTION NAME JMP LIST3 LIS11 ISZ TEMPS OUTPUT ISZ STK5 LDA TEMPS,I INTEGER JSB OUTIN JMP LIST3 OPERAND LIS12 LDA BLANK OUTPUT JSB OUTCR BLANK LDB STTYP JSB MCOUT OUTPUT LDA REMOP CPA TEMP2 A REM? JMP OUTS1 YES, OUTPUT REMARK LDA BLANK NO, OUTPUT JMP LIST5-1 LIS13 CLB HIGH-SPEED CPB STK18 PUNCH? JMP RDYDA,I LDA B133 YES, EMIT JSB WRITE,I JMP RDYDA,I LIS14 JSB OUTCR JSB OUTST LDA .34 JMP LIST5-1 OUTIN NOP INTEGER IN (A) LDB M4 SET STB DIGCT DIGIT COUNTER LDB LDVSR SET DIVISOR STB DIVSR ADDRESS CLB SET LEADING STB LDZRO ZERO FLAG OUT11 LDB DIVSR,I NEGATE CMB,INB AND STORE STB MIND DIVISOR CCB SET QUOTIENT INB TO ZERO ADA MIND SUBTRACT DIVISOR FROM INTEGER SSA,RSS NEGATIVE RESULT? JMP *-3 NO, INCREMENT QUOTIENT ADA DIVSR,I YES, RECOVER REMAINDER STA MCOUT AND SAVE IT LDA 1 SZA JMP OUT12 CPA LDZRO JMP OUT13 OUT12 ADA .48 NO, COMPUTE ASCII FOR DIGIT STA LDZRO SET ZEROES SIGNIFICANT JSB OUTCR OUTPUT DIGIT OUT13 LDA MCOUT RETRIEVE REMAINDER ISZ DIVSR SET FOR NEXT DIVISOR ISZ DIGCT DIVISION NECESSARY? JMP OUT11 YES ADA .48 NO, COMPUTE ASCII FOR LAST JSB OUTCR DIGIT AND OUT PUT IT JMP OUTIN,I OUTST NOP " ENTRY POINT LDA OUTST SAVE OUTST STA STK7 OUTS1 LDA TEMPS,I AND B177 SZA JSB OUTCR ISZ TEMPS ISZ STK5 RSS JMP LIST2 LDA TEMPS,I ALF,ALF YES, POSITION IT AND B177 EXTRACT CHARACTER CPA .2 JMP STK7,I CPA .3 JMP STK7,I JSB OUTCR NO, OUTPUT CHARACTER JMP OUTS1 MCOUT NOP MCOU1 LDA 1,I LOAD INFORMATION WORD AND OPMSK COMPARE WITH CPA TEMP2 OPERATOR CODE JMP MCOU2 EQUAL LDA 1,I UNEQUAL, AND .7 COMPUTE ADA .3 ENTRY ARS LENGTH ADB 0 COMPUTE ADDRESS OF NEXT ENTRY JMP MCOU1 MCOU2 LDA 1,I COMPUTE AND .7 ENTRY CMA,INA LENGTH STA STK8 CLE,INB SET FOR FIRST CHARACTER STB TEMP3 SAVE SYMBOL ADDRESS MCOU3 LDA TEMP3,I LOAD WORD SEZ,RSS FIRST CHARACTER? ALF,ALF YES, POSITION IT AND B177 EXTRACT CHARACTER JSB OUTCR OUTPUT IT SEZ,CME SET FOR NEXT CHARACTER ISZ TEMP3 MOVE TO NEXT WORD OF SYMBOL ISZ STK8 JMP MCOU3 YES JMP MCOUT,I LDVSR DEF *+1 DEC 10000 DEC 1000 DEC 100 DEC 10 SFLAG EQU ARRYS TABLE EQU PRGIN LNGTH EQU TEMPS+8 SMEND EQU INTCK SLENG EQU OVCHK TBLPT EQU FNDPS TSPTR EQU CLPRG INTGR EQU OVCHK HED *** EXECUTE "RENUMBER" SYSTEM COMMAND *** EXECUTE "RENUMBER" SYSTEMS COMMAND RENUM BSS 0 ENTRY POINT OF RENUMBER LDA !INS1 SET UP STA IN1 FOR LDA !INS2 PASS 1 STA IN2 AND LDA !INS3 PASS 2 STA IN3 LDB .10 STB LNUM SET LINE NUMBER TO 10 LDB PBUFF SET ADDR TO FIRST WORD STB ADDR ADDRESS OF USER S PROGRAM JMP FASTM FETCH A STATEMENT SET UP CALL FOR NEXT STATEMENT NXSTM LDB ADDR PUT ADDRESS IN B-REG ADB LNGT1 UPDATE BY PROG STMT LENGTH STB ADDR RESET VALUE OF PROGRAM ADDRESS LDA LNUM * UPDATE ADA .10 * LINE STA LNUM * NUMBER FETCH A STATEMENT ( OUTER LOOP ) FASTM CPB PBPTR END OF PROGRAM? JMP PASS3 YES - GO TO PASS 3 PROCESSOR LDA B,I LOAD LINE # AND STORE STA LNUM. FOR REFERENCE IN OUTER LOOP INB INDEX (B) TO LENGTH ADR LDA B,I LOAD STORE LENGTH STA LNGT1 SAVE LENGTH CHECK LINE NUMBER LDA LNUM LOAD X10 LINE NUMBER CPA LNUM. DOES IT MATCH? JMP NXSTM YES - GO TO NEXT STATEMENT STA ADDR,I SET NEW LINE # IN STATEMENT CHECK IF REFERENCED BY OTHER STATEMENT (INNER LOOP) LDB PBUFF LOAD PROGRAM START ADDRESS LOOP2 CPB PBPTR DONE? IN1 JMP NXSTM YES - RETURN TO OUTER LOOP INB INDEX TO STORE LENGTH STB LNGT2 SAVE FOR INDEXING INB INDEX TO OPERATIONS ADDRESS LDA B,I LOAD OPERATION TYPE AND OPMSK MASK TO OPERATIONS FIELD ALF,ALF POSITION OPERATION CODE RAR CPA N37 "GOTO" STATEMENT ? JMP PRCS YES - PROCESS IT CPA N40 "IF-THEN" STATEMENT ? JMP PRCS YES - PROCESS IT CPA N43 "GOSUB" STATEMENT ? JMP PRCS YES - PROCESS IT DOES NOT REFERENCE OUTER INSTRUCTION EXIT CCB SET B = -1 ADB LNGT2 SET NEXT STATEMENT START ADR ADB LNGT2,I INDEX BY STATEMENT LENGTH JMP LOOP2 CHECK NEXT STATEMENT PROCESS "GOTO" "GOSUB" "IF-THEN" STATEMENTS PRCS LDB M2 SET B = -2 ADB LNGT2 INDEX BY CURRENT "AT" ADDRESS ADB LNGT2,I INDEX BY STATEMENT LENGTH LDA B,I LOAD INSTRUCTION DESTINATION IN2 CPA LNUM. SAME AS CURRENT STATEMENT? RSS YES - UPDATE DESTINATION JMP EXIT NO - TRY NEXT STATEMENT IN3 LDA LNUM * SET CMA,INA * NEW STA B,I * DESTINATION JMP EXIT * ADDRESS PASS3 LDA !INS4 STA IN1 SET UP LDA !INS5 FOR STA IN2 PASS 3 CLA STA IN3 JMP LOOP2-1 !INS1 JMP NXSTM !INS2 CPA LNUM. !INS3 LDA LNUM !INS4 JMP RDYDA,I !INS5 SSA LNUM EQU TEMPS+1 LNUM. EQU TEMPS+2 LNGT1 EQU TEMPS+3 LNGT2 EQU TEMPS+4 ADDR EQU TEMPS+5 N60 EQU .48 N37 EQU .31 N40 EQU .32 N43 EQU .35 HED PRE-EXECUTION PROCESSING *********************** PHASE 2 OF THE COMPILER *********************** THIS PHASE HAS THE FOLLOWING 3 FUNCTIONS 1. SYMBOL TABLE CONSTRUCTION 2. FOR LOOP CHECKING 3. ARRAY STORAGE ALLOCATION MFASE LDA PBPTR CPA PBUFF JMP RDYDA,I STA FCORE LDA FWAM STA COML INITIALIZE COMMON POINTER LDA SYMTA STA SYMTF INITIALIZE SYMBOL TABLE POINTER LDA PBUFF STA MPTR INITIALIZE PROGRAM POINTER MLOP1 LDB MPTR,I STB .LNUM SET LINE NUMBER LDB MPTR ISZ MPTR ADB MPTR,I COMPUTE LOCATION OF NEXT STB MNPTR STATEMENT AND STORE THIS ISZ MPTR LDA MPTR,I FETCH THE FIRST WORD IN THE MLO10 ARS ALF,ALF PART TO DETERMINE THE TYPE OF AND .63 STATEMENT AND STORE STA TYPE CPA .46 JMP MLO12 CPA .30 IS THIS A REM STATEMENT STB MPTR CPA .43 IS THIS A PRINT STMT STB MPTR CCA STA MWDNO JMP MLOP2+1 MLO12 LDA MPTR INA LDA 0,I FETCH THE SECOND WORD IN THE STMT JMP MLO10 MLO13 AND MSK1 LDB MPTR SZA,RSS ADB .2 CPA .3 INB STB MPTR MLOP2 ISZ MPTR INCREMENT PROGRAM POINTER LDA MPTR CPA MNPTR HAS THE CURRENT STATEMENT JMP MLOP5 LDA MPTR,I SSA JMP MLO13 AND MSK1 SZA,RSS JMP MLOP2 STA MBOX1 AND .15 CPA .15 JMP MLOP6 ADA M4 SSA JMP MLOP7 LDA MBOX1 JSB SSYMA,I SSB,RSS JMP MLOP3 LDA MNEG LDB MNEG+1 STA MBOX1+1 STB MBOX1+2 LDA M3 JSB ESYMT MLOP3 LDB TYPE LDA MBOX1 CPB .34 JMP MLOP4 CPB .33 ISZ MWDNO JMP MLOP2 ISZ FCORE LDB FCORE CPB SYMTF JMP MER8-1 STA FCORE,I JMP MLOP2 MLOP4 LDB FCORE CPB PBPTR JSB ERROR IF NOT END ISSUE DIAGNOSTIC MER3 CPA FCORE,I RSS AS THE LAST FOR VARIABLE IN THE JMP MER3-1 FOR TABLE. NO, ERROR ADB M1 YES, DELETE LAST ENTRY FROM STB FCORE JMP MLOP2 THE POINTER AND GO TO PROCESS MLOP5 CPA PBPTR RSS JMP MLOP1 LDA TYPE CPA .37 JMP M1LOP JSB ERROR MLOP6 LDA MPTR,I AND OPMSK CPA DEFOP RSS JMP MLOP2 NO GO TO PROCESS NEXT WORD LDA MBOX1 SEARCH SYMBOL TABLE FOR JSB SSYMA,I SSB,RSS JSB ERROR FOUND. ERROR MULTIPLY DEFINED MER4 LDA MPTR ADA .3 ENTER THE FUNCTION INTO THE STA MBOX1+1 SYMBOL TABLE TOGETHER WITH LDA M2 ITS ENTRY POINT IN THE SOURCE JSB ESYMT CODE JMP MLOP2 GO TO PROCESS THE NEXT WORD MLOP7 STA 1 LDA TYPE CPA .27 JMP MLOP8 GO TO MLOP8 CPA .28 JMP MLOP8 JSB MSYMT LOOK UP IN SYMBOL TABLE JMP MLOP2 FOUND, GO TO PROCESS NEXT WORD CLA STA MBOX1+1 ENTER THE VARIABLE INTO THE STA MBOX1+2 SYMBOL TABLE WITH ITS STORAGE STA MBOX1+3 ALLOCATION, FORMAL AND ACTUAL JMP MLOP0 MLOP8 ISZ MPTR PROCESS COM OR DIM STMT ISZ MPTR LDA MPTR,I PICK UP FIRST DIMENSION ALF,ALF SHIFT M. S. PART OF WORD CPB M3 IS THIS A SINGLE DIMENSION ARRAY JMP *+5 YES, JUMP ISZ MPTR OF SECOND DIMENSION AND PACK ISZ MPTR NO, INDEX POINTER TO THE LOC, IOR MPTR,I RSS IOR .1 STA MBOX1+2 SET UP TO STORE PACKED STA MBOX1+3 DIMENSIONS IN FORMAL AND ACTUAL CLA SLOTS AND UNDEFINED FLAG IN STA MBOX1+1 STORAGE ALLOCATION SLOT JSB MSYMT SEARCH SYMBOL TABLE JMP MLOP9 NOT FOUND, JUMP LDA TYPE CPA .28 RSS JMP MLOP0 LDA MBOX1+2 JSB MDIM LDB COML STB MBOX1+1 ADB 0 STB COML MLOP0 LDA M4 JSB ESYMT JMP MLOP2 MLOP9 ADB .2 LDA 1,I SZA JSB ERROR MER5 LDA TYPE CPA .28 COM STMT? JMP ESYN3,I ERROR MISPLACED COM STMT LDA MBOX1+2 STA 1,I STORE THESE DIMENSIONS IN FORMAL INB AND ACTUAL SLOTS IN SYMBOL TABLE STA 1,I ENTRY JMP MLOP2 GO TO PROCESS NEXT WORD SKP M1LOP LDA FCORE CPA PBPTR RSS IS THE FOR TABLE EMPTY JSB ERROR NO, ERROR MER6 LDB SYMTF CHECK THROUGH THE SYMBOL TABLE M2LOP CPB SYMTA JMP M4LOP LDA 1,I AND .15 ADB .2 CPA .15 JMP M2LOP INB ADA M4 SSA,INA,RSS JMP M2LOP SZA,RSS JSB ERROR NO. OF DIMENSIONS UNSPECIFIED MER10 INA STA MBOX1+1 SET FLAG FOR NO. OF DIMENSIONS STB MBOX1 SAVE SYMBOL TABLE LOCATOR LDA 1,I PICK UP DIMENSIONS SZA DEFINED ? JMP M3LOP LDA STDIM NO, LOAD FIRST STANDARD DIMENSION ISZ MBOX1+1 SKIP IF SINGLE DIMENSION ADA .9 STA 1,I STORE IN FORMAL AND ACTUAL ADB M1 STA 1,I M3LOP JSB MDIM STA MBOX1+1 SAVE LDB MBOX1 ADB M2 LDA 1,I PICK UP STORAGE ASSIGNMENT SZA SKIP IF UNDEFINED JMP MER7 LDA FCORE STA 1,I STORAGE ASSIGNMENT SLOT ADA MBOX1+1 STA FCORE CMA,INA ADA SYMTF CHECK THAT THE ARRAY STORAGE SSA DOES NOT OVERLAP THE SYMBOL JSB ERROR TABLE IF SO GO TO ERROR MER7 ADB .3 JMP M2LOP M4LOP LDB PBPTR CPB FCORE JMP FASE3,I LDA MNEG STA 1,I INB LDA MNEG+1 STA 1,I INB JMP M4LOP+1 STDIM OCT 5001 ***************************** ENTER SYMBOL TABLE SUBROUTINE ***************************** THE SUBROUTINE IS CALLED WITH THE NEGATIVE OF THE ENTRY LENGTH IN A . THE ENTRY IS IN TEMPORARY LOCATIONS AND IS TRANSFERRED TO THE SYMBOL TABLE BY THE SUBROUTINE ESYMT NOP STA MBIN1 SAVE NEGATIVE OF LENGTH OF ENTRY ADA SYMTF STA SYMTF MOVE SYMBOL TABLE START LOCATOR STA MBIN2 UP BY THE LENGTH OF ENTRY CMA,INA CHECK THAT THE SYMBOL TABLE AND ADA FCORE SSA,RSS JSB ERROR OVERLAP ERROR MER8 LDB MBUF POINTER TO REQD ENTRY LDA 1,I TRANSFER ENTRY TO THE SYMBOL STA MBIN2,I TABLE INB ISZ MBIN2 ISZ MBIN1 JMP MER8+1 JMP ESYMT,I RETURN SKP ********************************************** SUBROUTINE TO SEARCH SYMBOL TABLE FOR AN ARRAY ********************************************** * MSYMT NOP B GIVES ARRAY TYPE -3 = 1 DIM, STB MBIN1 -2 = 2DIM, -1 = UNDIMENSIONED LDA MBOX1 LOAD IDENTIFIER JSB SSYMA,I SSB,RSS JMP MSYMT,I FOUND, RETURN ISZ MBIN1 IF ARRAY UNDIMENSIONED RSS JMP MSYM JUMP TO NOT FOUND EXIT ISZ MBIN1 SET UP TO CHECK THAT ARRAY DOES ADA .2 NOT APPEAR IN THE TABLE WITH ADA M1 DIFFERENT DIMENSIONS. CHANGE JSB SSYMA,I SSB,RSS SEARCH AGAIN JSB ERROR FOUND, INCONSISTENT DIMENSIONS MSYM ISZ MSYMT NOT FOUND, INCREMENT RETURN JMP MSYMT,I ADDRESS AND RETURN HED ** EXECUTE THE PROGRAM ** PHASE 3 OF THE COMPILER - PROGRAM EXECUTION FORMX NOP FORMULA BEGINS IN (TEMPS) LDB FORMX STB FORM CLB INITIALIZE OPERATOR JSB SLWST STACK FORM1 LDA TEMPS,I FETCH OPERAND ISZ TEMPS SET FOR NEXT WORD OF FORMULA AND OPDMK EXTRACT OPERAND STA TEMPS+6 AND SAVE IT SZA,RSS NULL OPERAND? JMP FORM2 YES JSB BHSTP SET STACK FOR OPERAND ADDRESS SSA FLAG BIT SET? JMP FORM4 YES JSB SSYMA,I INB,SZB,RSS JMP E8M1A,I NO AND .15 YES CPA .15 FUNCTION? JMP FORM6 STB HSTPT,I NO, STACK OPERAND ADDRESS FORM2 LDA TEMPS,I FETCH AND OPMSK OPERATOR ALF,ALF POSITION IT LDB 0 ADB FOPBS NO, LOAD OPERATOR ADA M8 NON-FORMULA SSA OPERATOR? CLB YES ADA D53 NO, NON-FORMULA SSA,RSS OPERATOR? CLB YES CLA NO LDA 1,I INFORMATION WORD AND MSK1 SAVE STA TEMPS+7 XOR 1,I SAVE ARS STA TEMPS+6 IDENTIFICATION JMP FOR11 FORM0 STA TSTPT,I STACK HIGH WORD LDA TSTPT STACK OPERAND STA HSTPT,I ADDRESS INA STORE STB 0,I LOW WORD FOR11 LDA LSTPT,I DOES OPERATOR AND MSK0 ON TOP OF CMA OPERATOR STACK ADA TEMPS+7 HAVE HIGHER SSA PRECEDENCE? JMP FORM9 YES, EXECUTE IF RSS NO FOR10 ISZ LSTPT LDB TEMPS+7 RETRIEVE PRECEDENCE ADB M15 NO, LEFT PARENTHESIS SSB OR LEFT BRACKET? ADB .15 NO, RESTORE PRECEDENCE ADB TEMPS+6 COMBINE IDENTIFICATION JSB SLWST WITH PRECEDENCE AND STACK JMP FORM1 FORM4 CPA FLGBT JMP FORM5 YES AND .15 NO, PRE-DEFINED CPA .15 FUNCTION JMP FORM7 YES LDB TEMPS+9 NO, MUST BE A JMP FORM2-1 PARAMETER FORM5 LDB TEMPS LOAD CONSTANT ADDRESS ISZ TEMPS MOVE POINTER TO ISZ TEMPS NEXT CODE WORD JMP FORM2-1 FORM6 STB TEMPS+6 LDB TSTPT JSB SLWST LDB TEMPS+6,I JSB SLWST LDA FORM STA HSTPT,I ADDRESS ON OPERHAND STACK JSB FORMX EVALUATE PARAMETER ISZ TEMPS UPDATE ISZ TEMPS FORMULA POINTER LDA TEMPS LDB LSTPT,I STB TEMPS STA LSTPT,I LDB TEMPS+9 LDA HSTPT,I ISZ LSTPT ISZ HSTPT STB LSTPT,I STA TEMPS+9 CPA TSTPT JSB RSCHK JSB FORMX LDA LSTPT,I STA TEMPS+9 LDA LSTPT ADA M3 STA LSTPT INA LDB 0,I STB TSTPT INA LDB 0,I STB TEMPS JSB STTOP FOR12 STA TSTPT,I STORE HIGH WORD LDA TSTPT STACK INA STORE STB 0,I LOW WORD ISZ HSTPT UNSTACK LDB HSTPT,I LOAD RESULT ADDRESS STB FORM ADA M1 STA HSTPT,I JMP FORM2 FORM7 LDA TEMPS+6 ALF,ALF ALF AND .31 ADA PDFBS LDB 0,I JSB SLWST LDA FORM STA HSTPT,I JSB FORMX ISZ TEMPS ISZ TEMPS LDB LSTPT,I CCA ADA LSTPT STA LSTPT STB ESYMT JSB STTOP JMP ESYMT,I FORM9 LDA LSTPT,I UNSTACK CCB OPERATOR ADB LSTPT INFORMATION STB LSTPT WOSD ALF,ALF COMPUTE AND B177 SUBROUTINE ADA ARBAS ADDRESS JMP 0,I EXECUTE EXECUTION BRANCH TABLE XECTB DEF ELET LET DEF XEC4 DIM DEF XEC4 COM DEF XEC4 DEF DEF XEC4 REM DEF EGOTO GO TO DEF EIF IF DEF EFOR FOR DEF ENEXT NEXT DEF EGOSB GOSUB DEF ERTRN RETURN DEF RDYDA,I DEF RDYDA,I DEF RDYDA,I DEF RDYDA,I DEF XEC4 DATA DEF EREAD READ DEF EPRIN PRINT DEF EINPT INPUT DEF ERSTR RESTORE DEF EMAT MAT 22255-80013 D
https://w.atwiki.jp/kakis/pages/6791.html
pildaf /// / こげ茶色 pil\daf \ 15 seren klel \
https://w.atwiki.jp/kakis/pages/5758.html
gildan /// / 鍛冶師、鍛冶職人 gild\an \ 13 seren klel \ [ ansiel ] \
https://w.atwiki.jp/sawa2/pages/46.html
Rails Rails 2.3.6 http //weblog.rubyonrails.org/2010/5/23/ruby-on-rails-2-3-6-released のてきとーな翻訳です。 Ruby on Rails 2.3.6リリース Jeremy Kemperにより2010/05/23に投稿されたものです。 私たちはRuby on Rails 2.3.6をリリースしましたよ。その内容は、6ヶ月に及ぶバグフィックス、いくつかの新しい特徴、Rails 3への大きな架け橋となります。 Rails 2.3.6に含まれる古くて使われない特徴をdeprecated(将来消される機能)にしました。なので、Rails 3では、それらが完全に消される可能性があります。もし、Rails 2.3.6上でのアプリケーションがdeprecation warning無しで動くのであれば、上手く移行できるでしょう。 このじっくりと作られた料理が有志による87人によりもたらされてます。 では、ごちそうをいただきましょう。 Action Pack Rackを1.0.1から1.1.0へアップデート XSS(クロスサイトスクリプティング)対策 Rails 3に合わせ(?) http //github.com/rails/rails_xss のものを公式プラグインとした クッキー convenient cookie jar add-ons to set permanent or signed cookies, or both at once cookies.permanent.signed[ remember_me] = current_user.id. さらに読む Flash もっとも一般的なキーであるalertとかnoticeとかをもっと使えるようにした。 self.alert = ... self.notice = ... とかが使える。 redirect_to url, alert = ... redirect_to url, notice = ... も加えた。さらに読む i18n(国際化) labelヘルパをローカルに(?) Active Record 名前空間(Namespacing) support optional table name prefixes on modules by defining self.table_name_prefix. さらに読む Destroy uses optimistic locking. Counter cache use Post.reset_counters(1234, comments) to count the number of comments for post 1234 and reset its comments_count cache. PostgreSQL サポートしていれば、常にstandard-conforming stringsを使う。 MySQL add indexにlengthのオプションをつけることができるようになった。。さらに読む MySQL add_columnとchange_columnに first = trueと after = other_columnの引数をつけることで、コラムの位置を変更できる。 Active Support i18nを1.3.3から1.3.7にアップグレード。 TZInfoを0.3.12から0.3.16へアップグレード。 マルチバイト speed up string verification and cleaning. JSON 可能であれば、JSONデコードのためにYAJLを使おう。 gem install yajl-ruby Testing add assert_blank and assert_present. Read more Core backport Object#singleton_class from Ruby 1.8.8, deprecating our Object#metaclass. Core add Object#presence that returns the object if it’s #present? otherwise returns nil. Example region = params[ state].presence || params[ country].presence || US Core add Enumerable#exclude? to match include?. Core rename Array#rand to Array#random_element to avoid collision with Kernel#rand. Core rename Date# and Time#last_(month|year) to #prev_(month|year) for Ruby 1.9 forward compatibility. Active Resource JSON ActiveResource Base.include_root_in_json = true とすると、to serialize as a hash of model name - attributes instead of a bare attributes hash。デフォルトはfalseです。 Action Mailer TMailを1.2.3から1.2.7にアップグレード。 Railties RubyGems 1.3.6 deprecation warningを出さない。 詳しくは、コミットログを読んでください。
https://w.atwiki.jp/dawnofwarii/pages/15.html
滅びゆく者たち エルダー 闘争の哀歌は終わらない エルダー。謎に包まれたかの古代種族が、その忌まわしい過去を公然と語ることはない。はるか昔。人類の遠い祖先が海から陸に上がったばかりの頃、エルダーはすでに銀河全域にまたがる大帝国を築き上げていた。彼らの気まぐれでいくつの星が滅び、いくつの太陽が姿を消したことか。だが、今の彼らに、昔日の栄光のおもかげはない。今や、栄華をきわめた文明は崩壊し、その末裔たちは果てることなき戦いに身を投じている。<失墜>と呼びならわされている災禍に見舞われる前、自らの運命を予見できるだけの正気を保っていた一部のエルダーたちは、クラフトワールドと呼ばれる命あるに分乗し、故郷を離れた。以来、彼らは宇宙に離散し、星々の間をあてどもなくさまよっている。それ自体がひとつの世界と言うべきこの巨大宇宙船だけが、かつて銀河に覇を唱えたエルダー文明の最後の 残滓 なのである。 何千年もの昔。エルダーはごう慢という罪のとりこになった。やがてエルダーは頽廃の道をたどり、ついに堕落の極みに達したのである。己の力を過信した彼らは、醜悪でおぞましい“神”を生み出すにいたった。生れ落ちた“神”の産声は、物理的な力をともなう思念波となってエルダー帝国の中枢を引き裂いた。あとに残ったのは、血にまみれて脈打つ純然たるケイオスの胎衣、<恐怖の眼>のみであった。“神”は今なお、エルダーたちの魂を貪ろうと、飽くなき獣欲をたぎらせている。エルダーがその魔手からかろうじて逃れることができているのは、自ら戦いに身を捧げることで、さらなる暗黒面に堕ちることを戒めているからに他ならない。ましてや時代は暗く、宇宙は戦いに満ちている。武辺の道に生きるエルダーが増える一方であるのは、当然の成り行きといえよう。 今やすべてを失ったエルダーではあるが、驚異のテクノロジーを操る彼らは、戦場では恐るべき敵と化す。流線型の機体も美しい反重力ビークルは、敵の砲撃をやすやすとかいくぐり、強力にして洗練された火器は、敵の厚い装甲をも一撃のもとに引き裂くであろう。精鋭のアスペクト・ウォリアーたちは、敵戦線の弱点をつき、数においては数倍する敵をたやすく葬り去る。武に優れしアスペクト・ウォリアーと力あ る 先見 ( ファーシーア ) の導き。この 2 つがなければ、かつての輝ける明星たるエルダーも、とうの昔に滅びていたであろう。 Eldarのヒーロー -Eldarのヒーロー Farseer A master psyker, the Farseer is a support caster who provides disruptive melee and strengthens troops with her spells. Warp Spider Exarch The Warp Spider Exarch is able to hit and run with his teleport ability. He can also teleport allies bringing them to and from battle. Warlock An offensive psyker, the Warlock specializes in damage spells and front line combat. Eldarのユニット -Eldarのユニット Guardian Squad エルダーの総人口は段階的な減少を続ける一方である。このため、本来は戦士でない市民たちも、武器を取らねばならない場面が増してきた。それゆえ、全てのエルダーはガーディアンとして戦うための訓練を受け、有事に備えている。 Ranger エルダーのレンジャーは、銀河最高の斥候にして狙撃手である。彼らは過酷な「道」の探求を諦め、放浪の生活を選んだ民であり、“アウトキャスト”とも呼ばれる。だが、彼らは自らのクラフトワールドと、その伝統に対する忠誠まで投げ捨てたわけではない。レンジャーのマントを身に纏う“アウトキャスト”の多くは、ファーシーアから語られた何らかの宿命を背負っているのだ。 Howling Banshees ハウリング・バンシーは、異常なまでに発達した運動神経を持ち合わせた戦士であり、彼女らの真価は白兵戦でいかんなく発揮される。また、ハウリング・バンシーたちの被るマスクには精神音波増幅機が内蔵されており、戦場で彼女らが上げる金切り声は、精神を打ち砕く衝撃波と化すのだ。 Warp Spider Squad 攻撃的な防御こそが、ワープ・スパイダーたちが用いる戦術の本質である。背面装甲に内蔵されたワープジャンプ・ジェネレーターによって、彼らは短距離のワープジャンプを可能にする。つまり彼らは、一瞬にして消滅した後、別の場所に姿を現すのだ。 Seer Council Shuriken Cannon Weapon Team ガーディアンたちが使う武器は、戦況によって様々だ。通常、彼らは支援戦力として働き、弾幕と重火器によるアスペクト・ウォリアーの支援を担当している。重火器はアンチグラヴ・プラットフォームに載せられ、荒地の上でも軽々と移動できる。携行可能な小型銃器から、グラヴ・タンクなどに搭載される巨大なキャノンに至るまで、シュリケン・ウェポンの動作原理はどれも同じだ。成型水晶製の弾倉に収められたいくつもの円盤が、銃器後部で生み出される強烈な推進力により銃身中で恐るべきスピードにまで加速される。これを解き放つことで、円形の刃が連続して銃身から射出されるのだ。その連射速度たるや100発を撃ちつくすのに数秒とかからぬほどだという。 Bright Lance Weapon Team ガーディアンたちが使う武器は、戦況によって様々だ。通常、彼らは支援戦力として働き、弾幕と重火器によるアスペクト・ウォリアーの支援を担当している。重火器はアンチグラヴ・プラットフォームに載せられ、荒地の上でも軽々と移動できる。エルダーのレーザー兵器は、サイキックパワーで結晶化されたクリスタルによって光線の濾過と純化が行われ、その威力を最大限にまで高められている。エルダーの多くは、「光そのものを武器となすレーザー兵器こそが、もっとも優美なる兵器の姿」と考えているようだ。 D-Cannon Weapon Team ガーディアンたちが使う武器は、戦況によって様々だ。通常、彼らは支援戦力として働き、弾幕と重火器によるアスペクト・ウォリアーの支援を担当している。重火器はアンチグラヴ・プラットフォームに載せられ、荒地の上でも軽々と移動できる。エルダーが保有するあらゆる兵器の中で、もっとも恐れられるこれらの銃器には、現実世界と地獄のような<歪み>を繋ぐ力が秘められている。ディストートキャノンは<歪み>を応用したテクノロジーによって物質界の構成因子を崩壊させ、次元そのものに穴をうがつ兵器なのだ。 Eldarのビークル -Eldarのビークル Falcon エルダー軍の中核をなすグラヴ・タンク、ファルコン。美しき流線型の機体は、エルダーと戦う敵にとって、恐怖の象徴として知れ渡っている。 FireE Prism 原始的で美しさの欠片もない他種族の戦車に比べ、ファイア・プリズムは遥かに優美で洗練されている。そして、その芸術的な外見とは裏腹に、ファイア・プリズムは恐るべき火力を備えているのだ。中でも主砲たるプリズムキャノンは、他の下品な種族たちが使う重戦車にとってまさしく天敵中の天敵である。 Wraithload Eldarのモンスター -Eldarのモンスター Avatar グローバルアビリティ +グローバルアビリティ [[]] #ref error :画像URLまたは、画像ファイル名を指定してください。 [[]] #ref error :画像URLまたは、画像ファイル名を指定してください。 [[]] #ref error :画像URLまたは、画像ファイル名を指定してください。 [[]] #ref error :画像URLまたは、画像ファイル名を指定してください。 [[]] #ref error :画像URLまたは、画像ファイル名を指定してください。 [[]] #ref error :画像URLまたは、画像ファイル名を指定してください。 [[]] #ref error :画像URLまたは、画像ファイル名を指定してください。 [[]] #ref error :画像URLまたは、画像ファイル名を指定してください。
https://w.atwiki.jp/sm4wiki/pages/18.html
ここは? ボススプライトを書くような高度なASMになると詰まっても助けてくれる人がいない…orz そこで、みんなで知識を持ち寄ってより高度でよりスタイリッシュなASMを作くったり、高度なASMの解析をしましょう! というページです。 目次 ここは? [#a88bf435] 目次 [#r7e0d310] 分岐ジャンプ命令とアドレスジャンプ命令の複数使用による偽類絶対アドレスモード分岐ジャンプ命令を行っている方へ [#cd717d41] JSR命令の仕様 [#sbbf5a3c] JSRについて知っておくべきこと [#rb15ae6c] GET DRAW INFO内のINVALIDについて [#u14912ff] JSLでGET_DRAW_INFOに飛ばす [#ka901d0c] Graphics Routine [#medbed90] はじめに [#v9ae12be] 1タイルのグラフィック [#be9097bd] 1タイルのグラフィック - 発展 [#t9689fe7] 条件によって異なるグラフィックを描く[#a61b3a59] 8x8サイズのタイルを描く [#b4dfd82a] 2タイル分のグラフィック [#fc953604] 2タイル描写 -アニメーションetc [#aa48ab7a] その他 [#oaa39067] マリオの座標上にグラフィックを描く [#j6cfa346] おまけ [#m1dc7e51] おこめ [#f614f587] 分岐ジャンプ命令とアドレスジャンプ命令の複数使用による偽類絶対アドレスモード分岐ジャンプ命令を行っている方へ ↓みたくJSRやJMPを複数のBEQなどで#??の値を1づつ増やしたりして分岐している方のための解説です。 ;code1 LDA MOTION,x BNE NOT_MOTION_0 JMP MOTION_0 NOT_MOTION_0 CMP #$01 BNE NOT_MOTION_1 JMP MOTION_1 NOT_MOTION_1 CMP #$02 BNE NOT_MOTION_2 JMP MOTION_2 : : : MOTION_0---code--- MOTION_1---code--- MOTION_2---code--- : : : ↑はこの項目を書いた私が昔に書いたコードです。汚いです、はぃ… ↑のコードは忘れて↓のサンプルコードを覚えてもらいたいです。 *下記のコードの成立条件:DBがPBと同一されてること ;code2 MOTION_POS_TXTdcw MOTION_0 $FFFF,MOTION_1 $FFFF,MOTION_2 $FFFF,... ;↑dcwより値は16bit、MOTION_?のアドレスの下位16bitが直書きされる MOTION_ROTINE LDA MOTION,x;A=0の時MOTION_0にジャンプ、A=1の時MOTION_1... ASL;ここから TAY REP #$20 LDA MOTION_POS_TXT,y STA $00 SEP #$20 JMP ($0000);ここまでで14bytes分 MOTION_0---code--- MOTION_1---code--- MOTION_2---code--- MOTION_?の?を0以外の任意の数とすると分岐コードだけの総byte数は、~ code1では分岐コード分だけで?×7+1、code2は?×2+16 結論:分岐が2以下だとcode2方がcode1より容量を食います。(´;ω;`)ウッ… なので使い分けてください。 JSR命令の仕様 GET_DRAW_INFOを逆汗中に詰まってたコードがやっと理解できたので載せておきます。 JSRについて知っておくべきこと 例えば org $012345;loromとかは省略しています。 JSR ROTINE org $013456 ROTINE というコードを挿入したとします。 この場合はJSRは$20,ROTINEの下位2bytesの3bytesで構成されます つまりこの場合JSR ROTINEは$20,$56,$34にアセンブルされます。 そして、JSRはPH命令を使う命令です。なので例えば org $012345 JSR ROTINE PLA RTS ROTINEPHA RTS こんなコードを入れるとフリーズします。 そのPHされる数はJSRの命令の最後尾のアドレス(例では$012347)の下位2bytes(例では$2347)がPHされます。そしてそれをRTSの命令によって2bytes分PLされてアドレス$012348目に戻ってくるわけです。(JSL、RTLの場合は3bytes分のPH,PLが実行されるだけ) GET DRAW INFO内のINVALIDについて 〇の数字順通りに命令が実行されます。 ;この時スタックには何も入っていないとする ;ここをアドレス$012345と置く JSR CODE;?JSRによって$2347がPHされる(stack=$47,$23) RTS;?ここに戻ってくる ;ここをアドレス$013456と置く CODEJSR INVALID;?JSRによって$3458がPHされる(stack=$47,$23,$58,$34) RTS;実質ここには来ません INVALIDPLA;?1byteがPLされる(stack=$47,$23,$58) PLA;?1byteがPLされる(stack=$47,$23) RTS;?stackの中にある2byteを読み込んで飛ぶ こんな感じです。なのでxkasなどでGET_DRAW_INFOをRTS→RTLだけして入れてJSLで読み込もうとすると画面外に出た瞬間にフリーズします。注意してください。 JSLでGET_DRAW_INFOに飛ばす どうしてもJSLで飛ばしたいお、と言う人のために一応載っけておきます。 「TABLE1」〜「BNE INVALID」は変わらず PHB PHK PLB 「LDY #$00」〜「BPL ON_SCREEN_LOOP」は変わ(ry PLB 「LDY $15EA,x」〜「STA $01」は(ry RTL INVALIDREP #$20 PLA PLY PLA PHY PHA SEP #$20 RTL ちなみに、JSLでGET_DRAW_INFOに飛ばす前にJSRでGFX_ROTINEに飛ばす的なコードなのが前提なコードです。 Graphics Routine はじめに カスタムスプライト(コマンド除く)での共通事項、それはグラフィックです。 カスタムスプライトを作る上でかなりの人が躓くであろうグラフィックの描写を攻略していきます。 では早速解説からいきましょう! グラフィックの描写 = スプライトの絵が描かれたタイルの設置です。 つまりグラフィックを描写するには、 タイルの位置、タイルの番号、タイルの情報(パレットなど)、タイルのサイズを決めてあげるのです。 スプライトにはそれぞれインデクス番号という番号が割り振られています。 65c816資料を見ると分かるようにスプライト関連のアドレスは他のRAMアドレスと違い長さ(12bytes)があります。 スプライトの向きや座標、速度のアドレスが被ると誤動作を起こすので被らないようにしてあるのです。 インデックス番号はXレジスタにスプライトルーチン開始時に代入されます。 つまり実際のスプライト用アドレスにインデクス番号を足したアドレスがそのスプライトのアドレスとなるのです。 ややこしや カスタムスプライトのグラフィックは$300~ 1つのタイルにつき4つ分のRAMを使います。 RAMアドレス 説明 $0300,y タイルの画面上でのX座標 $0301,y タイルの画面上でのY座標 $0302,y タイルのタイル番号下位バイト $0303,y タイルの属性 GET_DRAW_INFOによりOAMインデックスがYレジスタに格納されるので、$300,yのようにそれぞれのアドレスの後ろに,yをつけてあげます。 また、2タイル目以降も同様に $0304 タイル2の画面上でのX座標 $0305 タイル2の画面上でのY座標 $0306 タイル2のタイル番号下位バイト $0307 タイル2の属性 となっています。 GET_DRAW_INFOについては詳しく触れません、がGET_DRAW_INFOを呼び出すと、 $00に画面枠と比較したスプライトのX位置 つまりスプライトの画面上のX座標 $01に画面枠と比較したスプライトのY位置 つまりスプライトの画面上のY座標 がストアされます。この程度の認識でいいでしょう。 それではasmを編集していきましょう。 まず、適当なところでグラフィックルーチンを呼び出します。 普通はメインスプライトルーチンの最初に記述します。名前はなんでもいいですが、ここではSUB_GFXとします。 JSR SUB_GFX ;---------------------------------- ; GET_DRAW_INFOを呼び出します。当然同asm内にGET_DRAW_INFOの内容を記述してください。 ; GET_DRAW_INFOの内容はsprite tool(v135)のtutorialsフォルダ内のlibrary.asmにあるので ; そこからそっくりそのままコピペしましょう。そしてJSRで呼び出します。 SUB_GFX JSR GET_DRAW_INFO ;----------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; GET_DRAW_INFO ; This is a helper for the graphics routine. It sets off screen flags, and sets up ; variables. It will return with the following ; ;Y = index to sprite OAM ($300) ;$00 = sprite x position relative to screen boarder ;$01 = sprite y position relative to screen boarder ; ; It is adapted from the subroutine at $03B760 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TABLE1dcb $0C,$1C TABLE2dcb $01,$02 GET_DRAW_INFO STZ $186C,x; reset sprite offscreen flag, vertical STZ $15A0,x; reset sprite offscreen flag, horizontal LDA $E4,x; \ CMP $1A; | set horizontal offscr een if necessary LDA $14E0,x; | SBC $1B; | BEQ ON_SCREEN_X; | INC $15A0,x; / ON_SCREEN_X LDA $14E0,x; \ XBA; | LDA $E4,x; | REP #$20; | SEC; | SBC $1A; | mark sprite invalid if far enough off screen CLC; | ADC.W #$0040; | CMP.W #$0180; | SEP #$20; | ROL A; | AND #$01; | STA $15C4,x; / BNE INVALID; LDY #$00; \ set up loop LDA $1662,x; | AND #$20; | if not smushed (1662 0x20), go through loop twice BEQ ON_SCREEN_LOOP; | else, go through loop once INY; / ON_SCREEN_LOOP LDA $D8,x ; \ CLC; | set vertical offscreen if necessary ADC TABLE1,y; | PHP; | CMP $1C; | (vert screen boundry) ROL $00; | PLP; | LDA $14D4,x; | ADC #$00; | LSR $00; | SBC $1D; | BEQ ON_SCREEN_Y; | LDA $186C,x; | (vert offscreen) ORA TABLE2,y; | STA $186C,x; | ON_SCREEN_Y DEY; | BPL ON_SCREEN_LOOP; / LDY $15EA,x; get offset to sprite OAM LDA $E4,x; \ SEC; | SBC $1A; | $00 = sprite x position relative to screen boarder STA $00; / LDA $D8,x; \ SEC; | SBC $1C; | $01 = sprite y position relative to screen boarder STA $01; / RTS; return INVALID PLA; \ return from *main gfx routine* subroutine... PLA; | ...(not just this subroutine) RTS; / 今後GET_DRAW_INFOの記述はソースが冗長になるので省略させていただきますが、記述があると仮定して話を進めていきます。 ここからグラフィックの大きさや向きなどによって内容が分岐していきます。よって話の導入はここまで。 余談ですがlibrary.asmはGET_DRAW_INFOの他にも役に立つ処理やアドレスが載っているので目を通しておくといいかもしれません。 1タイルのグラフィック まずはX,Y座標の指定です。スプライトの画面上の座標 = タイルの画面上での座標とすればいいですね。 GET_DRAW_INFOを呼び出しその結果を用います。 $00がスプライトの画面上のX座標で$01がスプライトの画面上のY座標でしたね。 SUB_GFX JSR GET_DRAW_INFO LDA $00; \ 画面上のX座標 STA $0300,y; / LDA $01; \ 画面上のY座標 STA $0301,y; / こうなりますね。次にタイル番号の前に属性を指定します。 スプライトにはYXPPCCCTフォーマットという独自の形式があります。 これらの英文字の位置は2進数のbit位置と同じです。bit0がTでbit7がYになりますね。 Y 1で上下反転 X 1で左右反転 PP タイルの優先度...10で手前に表示され、11で透過します CCC パレット...SMWにおいて000がPalette 8…111がPalette Fです T 1でSP3,4のタイルを使います。0だとSP1,2になります これと$303,yに入るフォーマットとは一致しています。 これをそのままストア、つまり LDA #%???????? STA $0303,y とすればよいのですが、タイルが多くなると大変面倒になります。 タイル属性を設定するにあたって以下のRAMも覚えましょう。 ・$15F6,x スプライトのパレットです。Palette 8を使う場合$00が,9の場合$02が…Fの場合$0Eです。 またタイル番号上位バイト(つまりSP1,2/SP3,4のどちらか)でもあります。 SP3,4のページのタイル番号を使う場合、上の値に+$01しましょう。その数値が$15F6,xに入ります。 スプライトに関するRAMなので,xをつけてあげましょう。 ・$64 そのLevelのLevel ModeのSprite Layerの値が入ります。 入る値はLunar Magicでを押すと出る、マップのモードのSprite Layerの値です。 [パレットA,Sprite Layer 20,SP3,4のページを使用する]とした時の例です。 ; まずパレットの値を読み込みからです。 LDA $15F6,x ; ↑パレットA...$04 / SP3,4を使うので+$01 = $05 よって2進数で #%00000101 ORA $64 ; ↑Sprite Layer 20...$20なので2進数で #%00100000 ; ORAは論理和...2進数で足し算をすればいいです。 ; つまり#%00000101 + #%00100000 = #%00100101となりますね。 ; そしてこれを代入します。 STA $0303,y パレットやらSP3,4ページを使うといった設定はどこでするのでしょうか? 簡単な方法だとcfg_editorで設定します。どこかに日本語化を置いてあるので分かりやすいかと。 もちろんYXPPCCCTフォーマットを詳しく指定することでも設定できますが、 $15F6,xと$64を上のように使えば勝手にやってくれるので面倒な計算がいりません。 次にタイルのタイル番号の指定です。とにかく先に番号を決めてしまいましょう。~ LDA #$80 STA $0302,y Lunar Magicの (8x8エディタ)Tile 0x200からがスプライトのタイルです。 SP3,4のページを使う場合 Tile 0x300~のページを参照し、使わない場合は0x200~を参照します。 したがってSP3,4のページを使わずLDA #$70の場合Tile 0x270となり、SP3,4のページを使いLDA #$80の場合Tile 0x380となりますね。 それからそのタイルが8x8か16x16であるかを決めます。 $460,xが第1タイル、$461,xが第2タイル…と大きさを決めれます。値は$00が8x8で$02が16x16となります。 が、これはタイル毎に大きさを決める場合に使えばいいので今回はスルーします。 これを設定しない場合 Yレジスタに値を入れることですべての大きさが決まります。~ LDY #$00で8x8,LDY #$02で16x16と統一されます。指定した場合は$FFを入れましょう。 続いてA(アキュームレータ)に[設置するタイル数 - 1]の値を入れます。ここでの解説は1タイルのグラフィックなので[1 - 1 = 0]よりLDA #$00とします。 その後、画面外で描写しないルーチン(SNES $01 B7B3)にJSLで飛ばして終了です。 LDY #$02; タイルサイズを16x16で統一 LDA #$00; タイル数(1) - 1 = 0 JSL $01B7B3; 画面外で描写しない RTS; 終了 ↓ 最後に、今回できたグラフィックルーチンです。 SUB_GFX JSR GET_DRAW_INFO LDA $00; \ 画面上X座標 STA $0300,y; / LDA $01; \ 画面上Y座標 STA $0301,y; / LDA $15F6,x; \ ORA $64; | タイル属性 STA $0303,y; / LDA #$80; \ タイル番号 0x?80 STA $0302,y; / LDY #$02; タイルサイズを16x16で統一 LDA #$00; タイル数(1) - 1 = 0 JSL $01B7B3; 画面外で描写しない RTS; 終了 1タイルのグラフィック - 発展 ここまでで、1タイルのグラフィックの基本は学びました。知識を発展させましょう。 スプライトの向きを指定する 上で学んだグラフィックはあくまで必要な情報だけを取り入れたものなので、常に同じ方向しか向いていません。 一定方向に進むスプライトにしか使えませんね(´・ω・`)そこで$0303,yのタイル属性を弄ります。 $157C,x これはスプライトの向きを表すRAMです。($00-右向き,$01-左向き) スプライトに関するRAMなので,xがついてます。 $00〜$0F あらゆる場面において計算に使われているRAMです。だからと言って空きRAMというわけではないのでご注意を ここからはグラフィックの記述において必要以外の部分は省略します。;----省略内容---という風に省略されます。 (ほぼ文字説明と言えど量が多いとページ表示が遅くなりますし) SUB_GFX JSR GET_DRAW_INFO LDA $157C,x; まずこのスプライトの向きを STA $02; $02というRAMに代入します。 ; これで$02は、スプライトが右向きなら$00,左なら$01が入ることになります。 ;--------座標指定略--------- LDA $15F6,x PHX; まずこのカスタムスプライトのインデクス番号を保管しておきます。 LDX $02; 続いてこのスプライトの向きを呼び出します。 BNE NO_FLIP; $00(右向き)でないなら[NO_FLIP]に移動させます。 ORA #$40; 左向きの場合 タイルを左右反転させます。 NO_FLIP ORA $64; 右向きなら左右反転をせずにそのまま$0303,yに代入します。 STA $0303,y PLX; スプライトのインデクス番号を戻してあげます。 ;--------以下略--------- なぜ#$40(= #%01000000)を加えるのか... それはYXPPCCCTフォーマットに当てはめるとXが1になり、左右反転するからですね。 左向き時はORA #$40によりタイルは左右反転、右向き時はこれを飛ばすので反転無しとなりますね。 こんな感じです。もちろん他の場所でマリオの方を向かせるように設定しないと効果がありません。(墓場のカスタムスプライトのうんちく参照) LDXなどとXレジスタを使う命令を用いる場合、このようにPHXとPLXを使ってインデクス番号を保管します。 でないとインデックス番号が変わってしまい誤動作を起こすからです。 アニメーションさせる $14 フレームカウンタです。常に1フレームに$01増加していますがマリオのダメージ中などは停止します。 ちなみに止まらないのは$13です。RAMアドレスについてはCにあるRAM Mapを見ましょう。 $14は常に$00~$FFまで増加し、また$00に戻ります。$FFの時に1/2(LSR)にするとどうなるでしょうか? $FF * 1/2 = $7Fですね。さらに1/2倍で$3F、3回目{1/8(LSR *3)}で$1Fになりますね。 LDA $14; フレームカウンタを LSR A; 1/2倍 LSR A; 計1/4倍 LSR A; 計1/8倍して STA $03; $03に代入 これで$03は$00~$1Fに増加し、$1Fになったあと$00に戻ることになります。 この$03をAND #$03してみましょう。ANDは論理積です。 $03の中身が$1Fだとすると $1F- #%00011111 AND #$03 - *#%00000011 ---------------------------- =#%00000011 となり答えは#$03になります。同様に計算していくと、中身が$1Eなら答えは#$02,$1Dなら#$01,$1Cなら#$00,$1Bなら#$03... もうお分かりのはずです、この場合$03は$00~$03まで増加し$00へ戻るものとなります。 LDA $14; フレームカウンタを LSR A; 1/2倍 LSR A; 計1/4倍 LSR A; 計1/8倍して AND #$03; さらに#%00000011で論理積を出し STA $03; $03に代入 こうすればOKです。これで$00~$03まで増加し、また$00へ戻るという4種類のタイル番号専用カウンタができました。 2種類にしたい場合はどうでしょうか?AND #$01とすれば$00~$01まで増加し$00へ戻るので、 2種類のタイル番号専用カウンタが出来上がりです。 また、アニメーションの速度を変えるにはLSRを増やすことでさらに遅くなり、ASL(*2倍)を加えると速くなります。 次にタイルの指定方法です。 TILEMAPdcb $80,$82,$84,$86 ; まずタイルのテーブルを組みます。SUB_GFXの上に置けばいいでしょう。 ; この場合$80→$82→$84→$86→$80→$82...と変わっていきます。 ; 2種類の場合はdcb $80,$82とすれば$80→$82→$80→$82...となります。 ; その場合は上のAND #$03を#$01に、TILEMAPを dcb $80,$82としましょう。 ; --------------------- LDX $03; 上で設定したようにXは$00→$01→$02→$03→$00...と変わっていきます。 LDA TILEMAP,x; したがってXが$00のときTILEMAPは$80,$01のとき$82...となります。 STA $0302,y; それを代入すればOKです。 これまでの物を組み合わせましょう。 TILEMAPdcb $80,$82,$84,$86 SUB_GFX JSR GET_DRAW_INFO LDA $14; フレームカウンタを LSR A; 1/2倍 LSR A; 計1/4倍 LSR A; 計1/8倍して AND #$03; さらに#%00000011で論理積を出し STA $03; $03に代入 ;--------座標,属性指定略--------- PHX; LDXを使うのでスプライトインデックス番号を格納しておく LDX $03; 上で設定したようにXは$00→$01→$02→$03→$00...と変わっていきます LDA TILEMAP,x; したがってXが$00のときTILEMAPは$80,$01のとき$82...となります STA $0302,y; それを代入すればOKです PLX; Xを使い終わったのでインデックス番号を戻してあげます ;--------以下略--------- こうなります。これが1タイルで4種類にアニメーションするタイルのグラフィックとなります。 条件によって異なるグラフィックを描く 条件は何でも好きに決めましょう。 たとえばON/OFF or Pスイッチ、座標を調べたりあるいは空きRAMだったり…今回はON/OFFスイッチにしましょう。 TILEMAPdcb $80,$82 ;↑ ON時,OFF時 グラフィック ;----GET_DRAW_INFOの記述--- LDA $14AF; \ ON/OFFスイッチの現在の値を STA $03; / $03に代入 ;----座標指定---- LDX $03 LDA TILEMAP,x STA $0302,y ;--------以下略--------- $14AFはご存じ、ON/OFFスイッチのRAMです。ON $00 / OFF $01がAに入ります。 したがってONの時にはTILEMAPを$00右にずらす(=ずれない)ので$80、OFF時はTILEMAPを$01右にずらすので$82となるのです。 次にフレームと組み合わせます。これが一番厄介です。 1タイル分のグラフィックは簡単ですが、タイル数が大きいとTILEMAPも多くなり指定がかなり面倒になります。 「ON時 $80,$82のアニメーション有り、OFF時 $A0のアニメ無し」というグラフィックの記述です。 TILEMAPdcb $80,$82,$A0 ;↑ ON /OFF ;----GET_DRAW_INFOの記述--- LDA $14; \ LSR A; | 1フレーム毎に$00,$01,$00…となり LSR A; | $03に代入されます。 LSR A; | 詳しくは前章『アニメーションさせる』を参照してください。 AND #$01; | STA $03; / LDA $14AF; \ ON(A=0)の場合は BEQ NEXT; | ラベル NEXTに飛び LDA #$02; | OFF(A=1)の場合は、#$02を STA $03; / $03に代入 NEXT ;----座標指定---- LDX $03 LDA TILEMAP,x STA $0302,y ;--------以下略--------- まずLDA $14~STA $03でアニメーションをさせているのがわかります。 $03に$00,$01.$00…と入るので、TILEMAPは右に[$00ずれる,$01ずれる,$00ずれる…] 即ち、TILEMAPは[$80,$82,$80…]となりますね。 次にOFFの場合は$03を$02で固定させます。これにより右に[$02ずれるで固定]される… つまりTILEMAPは [$A0で固定]されるのです。ONの場合はそれを飛ばしています。 この場合LDA $14AF〜の記述は必ず後に持ってきます。でないとアニメーションが変になります。 これでアニメーション/固定はできました。 つぎにアニメーション/アニメーションをやってみましょう。 TILEMAPdcb $80,$82,$A0,$A2 ;↑ ON / OFF ;----GET_DRAW_INFOの記述--- LDA $14AF; \ OFF(≠$00)なら BNE NEXT; / ラベル NEXTへ LDA $14; \ LSR A; | 1フレームごとのアニメーション LSR A; | $03は[$00,$01,$00…]と毎フレーム変動する LSR A; | AND #$01; | STA $03; / BRA NEXT2; 次のNEXTの部分は必要ないので飛ばす NEXT LDA $14; \ LSR A; | 1フレームごとのアニメーション LSR A; | LSR A; | AND #$01; | CLC; | ADC #$02; | に +02をする。 STA $03; / これで$03は[$02,$03,$02…]と毎フレーム変動する NEXT2 ;----座標指定---- LDX $03 LDA TILEMAP,x STA $0302,y ;--------以下略--------- これはTILEMAPの指定位置をずらす方法です。 ON時はTILEMAPが右に[$00,$01,$00…]分ずれるので、TILEMAPは[$80,$82,$80…]となり、 OFF時は右に[$02,$03,$02…]分ずれるので、TILEMAPは[$A0,$A2,$A0…]となります。 今回は1フレーム毎のアニメーションだってので+02をしましたが、フレーム数によって変わるので注意してください。 別解があります。状況に応じてどちらを使うか決めましょう。 TILEMAPdcb $80,$82; ON時のアニメーション TILEMAP2dcb $A0,$A2; OFF時のアニメーション ;----GET_DRAW_INFOの記述--- LDA $14; \ LSR A; | 1フレームごとのアニメーション LSR A; | $03は[$00,$01,$00…]と毎フレーム変動する LSR A; | AND #$01; | STA $03; / ;----座標指定---- LDX $03 LDA $14AF; \ OFF(≠$00)なら BNE NEXT; / ラベル NEXTへ LDA TILEMAP,x; ONだったのでTILEMAPを読み込む BRA NEXT2 NEXT LDA TILEMAP2,x; ONだったのでTILEMAP2を読み込む NEXT2 STA $0302,y ;--------以下略--------- こちらは二つのTILEMAPを用いる方法です。 ON/OFFの状況に応じてどちらのTILEMAPを読み込むか決めているのが分かりますね。こっちの方が分かりやすいと思いますが、タイル数が多いと変わってくるでしょう。 8x8サイズのタイルを描く 最初の方で説明しましたが$460,xが第1タイルの大きさ、$461,xが第2タイル…と個別に大きさを決めることが可能です。値は$00が8x8で$02が16x16となります。 4フレームのアニメーションをするタイル描写をしてみましょう。 TILEMAP dcb $2C,$2D,$2C,$2D PROPERTIES dcb %00000100,%00000100,%11000100,%11000100; XYPPCCCTフォーマット ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUB_GFX JSR GET_DRAW_INFO; Yレジスタ = OAM offset LDA $14; フレームカウンタを LSR A; 1/2倍 LSR A; 計1/4倍 LSR A; 計1/8倍して AND #$03; さらに#%00000011で論理積を出し STA $03; $03に代入 LDA $00; \ 画面上X座標 STA $0300,y; / LDA $01; \ 画面上Y座標 STA $0301,y; / PHX; Xを使うのでスプライトインデックス番号を格納しておく LDX $03; \ LDA PROPERTIES,x; | タイル属性 ORA $64; | STA $0303,y; / PLX; Xを使い終わったのでインデックス番号を戻してあげます PHX; Xを使うのでスプライトインデックス番号を格納しておく LDX $03; \ LDA TILEMAP,x; | タイル番号を代入 STA $0302,y; / PLX; Xを使い終わったのでインデックス番号を戻してあげます LDA #$00; \ タイルの大きさを8x8に STA $0460,x; / LDY #$FF; タイルサイズを個別に指定 LDA #$00; タイル数(1) - 1 = 0 JSL $01B7B3; 画面外で描写しない RTS; 終了 始めに気付くのはPROPERTIESです。$15F6だと一括指定しかできません。そこでこのようにタイル毎に決めて上げるのです。 PROPERTIESはXYPPCCCTフォーマットの書式で決めます。分かり易いように2進数表記なので%aaaaaaaaとなっていますが、2進数や16進数がバッチリな方は16進数表記($aa)に直すと見やすくなるでしょう。 またこれで指定するのはフォーマットのX,Y,CCC,Tの部分のみで大丈夫です。ORA $64がPPの判断をしてくれるからです。 一通りタイルの指定が終わった後、$0460,xに00を入れ、『このタイルは8x8サイズだ』という宣言をします。 タイルの大きさを個別に宣言した場合は最後にYレジスタに$FFを入れればいいんでしたよね。 これで8x8サイズのタイル描写の完成です。 2タイル分のグラフィック 縦に2タイル並べたり、横に並べたりいろいろありますがとりあえず縦の描写をやってみましょう。 まず知っておきたいことはループです。ループについてはこちらを見ることで説明の代わりとさせていただきます。 次に概念的なお話です。 2タイルの描写をするので描かれるタイルは2枚、当然タイル毎に位置を決めてあげないと描写する位置が被ってしまいます。 そこでタイルの描写位置をずらします。 何も指定しない(位置をずらさない)場合の位置を(つまり基準)$00とすると、 X座標において10加えると1タイル分右にずれ、F0加えると1タイル分左にずれます。 Y座標において10加えると1タイル分下にずれ、F0加えると1タイル分上にずれます。 16進数では、1~7Fが正、80~FFが負となります。これは2進数に直した場合bit7が0か1かによるものです。 また正の場合横(X)移動では右に、縦(Y)移動には下に移動します。負の場合は横移動では左に、縦(Y)移動には上に移動します。 このことから上2つの説明が成り立ちますね。また1タイルの半分ずらすには正方向には08、負方向にはF8ずらせばいいです。 10は10進数で16なので半分の08となるからですね。 詳しくはこれを見るといいでしょう。(鬼畜王氏の講座にほぼ同じものがあるケド) #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (pos.png) これを見る限り、縦に2タイル分を作る場合は (X 00/Y F0)+(X 00/Y 00) もしくは (X 00/Y 00)+(X 00/Y 10) とずらして描けばいいみたいですね。 しかし後者(Y 00-Y 10)の場合を考えてみましょう。(X 00/Y 00)が基準と説明しました。 なので地面と接するスプライト(例えばノコノコ)は基準の位置が地面に接します。 したがって、Y 10だと下に1タイル分ずれるので下半分のタイルが地面に埋まってしまうのです。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (nokonoko.png) なので (X 00/Y F0)+(X 00/Y 00) の方を用いましょう。まずは、必要なものを決めちゃいます。 TILEMAP dcb $82,$A2; 上のタイル番号,下のタイル番号 Y_OFFSET dcb $F0,$00; 同上 続いてループ処理の設定です。 PHX; ループにXレジスタを使用するので、インデクス番号を保護する LDX #$01; ループ回数 = タイル数(2) - 1 = 1 LOOP_START ; ここからループさせたい処理 DEX; \ ループの処理でこの記述は必須ですよね BPL LOOP_START; / PLX; ループが終了したのでインデクス番号を戻してあげる 65C816プログラミングのループについてををみるとこのように指定していますね。この中にタイル描写をする処理を入れて繰り返させるのです。 ではソースを見てみましょう。 TILEMAP dcb $82,$A2 Y_OFFSET dcb $F0,$00 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUB_GFX JSR GET_DRAW_INFO; Yレジスタ = OAM offset PHX; ループにXレジスタを使用するので、保護する LDX #$01; ループ回数 = タイル数(2) - 1 = 1 LOOP_START LDA $00; \ X座標はこれまで通り STA $0300,y; / LDA Y_OFFSET,x; \ CLC; | タイル位置(基準=00)にF0と00を足すと ADC $01; | タイル位置はF0と00になりますね STA $0301,y; / LDA TILEMAP,x; \ タイルマップを代入 STA $0302,y; / PHX; Xレジスタを使用するのでインデクス番号を保管 LDX $15E9; スプライトのインデクス番号に関するRAM これがないとパレットなどがおかしくなります LDA $15F6,x; \ ORA $64; | タイル属性 STA $0303,y; / PLX; Xレジスタを使い終わったのでインデクス番号をもどす INY; \ INY; | INY; | INY; / DEX; \ ループの処理でこの記述は必須ですよね BPL LOOP_START; / PLX; ループが終了したのでインデクス番号を戻してあげる LDY #$02; タイルサイズを16x16で統一 LDA #$01; タイル数(2) - 1 = 1 JSL $01B7B3; 画面外で描写しない RTS; 終了 これまでの説明が分かる人なら、座標とタイル番号、タイル属性をどう指定しているか大体分かるハズです。 しかし1つ気にかかる点があることでしょう。なぜINYを4つも入れているのでしょうか? 講座の最初の方にタイルに関するRAMの説明をしましたね。$0300,$0301,$0302,$0303のことです。例えば1タイル目のX座標は$0300で2タイル目のX座標は$0304です。察しのいい人は気付いたかも知れません。 $0300に4を足すと$0304になります。もともと$0300,yとなっているのでYに4を足せば$0304になるのが分かるでしょう。 つまり最初のループで1タイル目に関して一通りの設定(座標、属性etc...)が終わった後にYを増加させます。 すると$030Xは+4されて『2タイル目の設定ができますよー』という状態になります。そこでループ処理(BPL LOOP_START)でタイル指定の最初に戻すのです。 そうすれば2タイル目の設定をやってくれるのです。ちょっと日本語がおかしいですが大体の流れはつかめたはずです。 横へ2タイルは座標指定の部分をこうすればいいですね。 LDA Y_OFFSET,x CLC ADC $00 STA $0300,y LDA $01 STA $0301,y この説明では必要な情報のみでアニメーションもなく向きも変わらないものなので、それらの機能をつけて上げましょう。 2タイル描写 -アニメーションetc やりたいことの説明は既に済んでます。これを読み直すといいでしょう。2タイルになってもほとんど変わりません。 ということで早速ソースを見てみましょう。 TILEMAP dcb $82,$A2; 1フレーム目のタイル dcb $82,$A0; 2フレーム目のタイル Y_OFFSET dcb $F0,$00; 上のタイル.下のタイル ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUB_GFX JSR GET_DRAW_INFO; Yレジスタ = OAM offset LDA $157C,x; \ スプライトの向きを$02に代入 STA $02; / LDA $14; \ フレームカウンタを LSR A; | (1/2) LSR A; | (1/4) LSR A; | 計1/8倍 AND #$01; | これで $00 → $01 → $00 → $01 となるカウンタになる ASL A; | 2倍すると $00 → $02 → $00 → $02 となるカウンタになる STA $03; / これを$03に代入 PHX; ループにXレジスタを使用するので、保護する LDX #$01; ループ回数 = タイル数(2) - 1 = 1 LOOP_START LDA $00; \ X座標はこれまで通り STA $0300,y; / LDA Y_OFFSET,x; \ CLC; | タイル位置(基準=00)にF0と00を足すと ADC $01; | タイル位置はF0と00になりますね STA $0301,y; / PHX TXA; X → A(つまりインデクス番号をAに持ってくる) CLC; \ Aにカウンタの分を足してあげます ADC $03; / TAX; A → X(足した値を戻す) LDA TILEMAP,x; \ タイルマップを代入 STA $0302,y; / PLX PHX LDX $15E9; スプライトのインデクス番号に関するRAM これがないとパレットなどがおかしくなります LDA $15F6,x; パレット LDX $02; \ このスプライトの向きを呼び出します BNE NO_FLIP; | = 0(右向き)でないなら[NO_FLIP]に移動させます ORA #$40; | 左向きの場合、タイルを左右反転させます NO_FLIP ORA $64; | 右向きなら左右反転をせずにそのまま$0303,yに代入します STA $0303,y; / タイル属性を代入 PLX INY; \ INY; | ループ毎にタイルのRAMのアドレスを増やす INY; | INY; / DEX; \ ループの処理でこの記述は必須ですよね BPL LOOP_START; / PLX; ループが終了したのでインデクス番号を戻してあげる LDY #$02; タイルサイズを16x16で統一 LDA #$01; タイル数(2) - 1 = 1 JSL $01B7B3; 画面外で描写しない RTS; 終了 スプライトをどうアニメーションさせるかは、どのようにカウンタ(今回は$03)をつくるかと同じです。 ソース内の記述にあるように$03は$00 → $02 → $00 → $02…と変化します。 つまりTILEMAPは$00分右にずれる → $02分右にずれる → $00分右にずれる → $02分右にずれる… よって$82,$A2 → $82,$A0 → $82,$A2 → $82,$A0…となるのです。 あとはほとんど変わりないはずです。これで2タイル分のグラフィックは終了です。 書いた人は疲れてしまいました。続きを見たい方はワッフルワッフル その他 マリオの座標上にグラフィックを描く スプライトの座標 = マリオの座標として、マリオを隠せばいいだけです。 したがって、 LDA #$7F; \ マリオを透明化 STA $78; / ;------ LDA $94; \ スプライトX座標 low = マリオX座標 low STA $E4,x; / LDA $96; \ スプライトY座標 low = マリオY座標 low STA $D8,x; / LDA $95; \ スプライトX座標 high = マリオX座標 high STA $14E0,x; / LDA $97; \ スプライトY座標 high = マリオY座標 high STA $14D4,x; / これをメインルーチンに記述すればいいのです。 しかしこの場合、マリオがチビの時はマリオの頭上(スーパーマリオの顔の位置)にスプライトが来てしまいます。 なのでマリオのY座標(low)を修正しましょう。LDA $96/STA $D8,xを以下に変えてください。 LDA $96; \ スプライトY座標 low = マリオY座標 low + $10 CLC; | $10で1タイル分です ADC #$10; | STA $D8,x; / おまけ #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (graphics.zip) これまでの講座で学んできたグラフィックルーチンの参考例です。 スプライト製作に少しでも役立てられたら幸いです。 ASL/LSRのご指摘ありがとうございました。 間違っているところがあったら勝手に直すか、コメントお願いします。 おこめ
https://w.atwiki.jp/sansara_naga2_sfc/pages/29.html
呪文 回復量・ダメージ量の範囲 ID 名称 範囲 タイプ 02 DIOS 3〜7 回復 03 BADIOS 7〜15 無属性 0A DIAL 6〜15 回復 0B BADIAL 15〜31 無属性 10 LITOKAN 9〜23 火炎属性 13 DIALMA 10〜23 回復 14 BADIALMA 21〜47 無属性 17 LORTO 17〜35 冷気属性 1B MALIKTO 37〜71 無属性 1D HALITO 3〜7 火炎属性 23 MOLITO 8〜17 火炎属性 24 TZALIK 37〜57 無属性 26 MAHALITO 13〜23 火炎属性 28 DALTO 17〜35 冷気属性 29 LAHALITO 17〜35 火炎属性 2D MADALTO 31〜63 冷気属性 2F LADALTO 51〜97 冷気属性 33 TILTOWAIT 78〜149 火炎属性 回避係数 敵から呪文を受けた際の回避率に影響する数値です。 ID 呪文 回避係数 08 MANIFO 6 09 MONTINO 5 12 BADI 6 19 MABADI 1 1F KATINO 5 上記の呪文は 以下の確率で回避することができます MAGE の呪文 (I.Q.) × (回避係数) + (呪文抵抗補正) % PRIEST の呪文 (PIE) × (回避係数) + (呪文抵抗補正) % 呪文抵抗補正 "呪文" 抵抗を持っている場合 20 それ以外の場合 0 ソース ; (味方 → 敵側での定義) ; DIOS ; C988 A2 05 LDX #$05 C98A A0 03 LDY #$03 C98C 44 D9 BSR $C967 ; ; DIAL ; C9A3 A2 0A LDX #$0A C9A5 A0 06 LDY #$06 C9A7 80 E3 BRA $C98C ; ; DIALMA ; C9A9 A2 0E LDX #$0E C9AB A0 0A LDY #$0A C9AD 80 DD BRA $C98C ; ; BADIOS ; CA76 A2 09 LDX #$09 CA78 A0 07 LDY #$07 CA7A 62 CLA CA7B 85 8A STA $8A ; ; BADIAL ; CA9D A2 11 LDX #$11 CA9F A0 0F LDY #$0F CAA1 80 D7 BRA $CA7A ; ; BADIALMA ; CAA3 A2 1B LDX #$1B CAA5 A0 15 LDY #$15 CAA7 80 D1 BRA $CA7A ; ; TZALIK ; CAA9 A2 15 LDX #$15 CAAB A0 25 LDY #$25 CAAD 80 CB BRA $CA7A ; ; HALITO ; CAAF A2 05 LDX #$05 CAB1 A0 03 LDY #$03 CAB3 A9 01 LDA #$01 CAB5 80 C4 BRA $CA7B ; ; LITOKAN ; CB4B A2 0F LDX #$0F CB4D A0 09 LDY #$09 CB4F A9 01 LDA #$01 ; ; MOLITO ; CBA1 A2 0A LDX #$0A CBA3 A0 08 LDY #$08 CBA5 80 A8 BRA $CB4F ; ; MAHALITO ; CBA7 A2 0B LDX #$0B CBA9 A0 0D LDY #$0D CBAB 80 A2 BRA $CB4F ; ; LAHALITO ; CBAD A2 13 LDX #$13 CBAF A0 11 LDY #$11 CBB1 80 9C BRA $CB4F ; ; LORTO, DALTO ; CBB3 A2 13 LDX #$13 CBB5 A0 11 LDY #$11 CBB7 A9 02 LDA #$02 CBB9 80 96 BRA $CB51 ; ; MADALTO ; CBBB A2 21 LDX #$21 CBBD A0 1F LDY #$1F CBBF 80 F6 BRA $CBB7 ; ; LADALTO ; CBC1 A2 2F LDX #$2F CBC3 A0 33 LDY #$33 CBC5 80 F0 BRA $CBB7 ; ; MALIKTO ; CBC7 A2 23 LDX #$23 CBC9 A0 25 LDY #$25 CBCB 62 CLA ; ; TILTOWAIT ; CBF4 A2 48 LDX #$48 CBF6 A0 4E LDY #$4E CBF8 A9 01 LDA #$01 CBFA 80 D0 BRA $CBCC ; ; 敵 → 味方 の命中率周り ; A36B A0 02 LDY #$02 ; PIE A36D C9 1D CMP #$1D ; 0x1D HALITO A36F 90 02 BCC $A373 ; A371 A0 01 LDY #$01 ; I.Q. A373 48 PHA A374 98 TYA A375 AE 40 2B LDX $2B40 A378 20 17 41 JSR $4117 A37B 85 7F STA $7F ; 特性値 A37D 68 PLA A37E A0 04 LDY #$04 A380 44 E4 BSR $A366 A382 85 7E STA $7E ; 係数取得 A384 62 CLA A385 A2 08 LDX #$08 A387 0A ASL A A388 26 7F ROL $7F A38A 90 07 BCC $A393 A38C 18 CLC A38D 65 7E ADC $7E A38F 90 02 BCC $A393 A391 E6 7F INC $7F A393 CA DEX A394 D0 F1 BNE $A387 A396 85 7E STA $7E ; 特性値 × 係数 A398 A6 7F LDX $7F A39A F0 02 BEQ $A39E A39C A9 64 LDA #$64 A39E 60 RTS ボーナスポイント ボーナスポイント 確率 5〜9 238/256 17〜19 16/256 20〜28 2/256 50〜59 0/256 ソース A647 A9 FF LDA #$FF A649 20 C6 40 JSR $40C6 ; 乱数 0〜254 を取得 A64C C9 FF CMP #$FF A64E F0 26 BEQ $A676 A650 C9 FD CMP #$FD A652 B0 18 BCS $A66C A654 C9 ED CMP #$ED A656 B0 0A BCS $A662 A658 A9 05 LDA #$05 A65A 20 C6 40 JSR $40C6 A65D 18 CLC A65E 69 05 ADC #$05 ; 確率 238/256 で 5〜9 A660 80 1C BRA $A67E A662 A9 03 LDA #$03 A664 20 C6 40 JSR $40C6 A667 18 CLC A668 69 11 ADC #$11 ; 確率 16/256 で 17〜19 A66A 80 12 BRA $A67E A66C A9 09 LDA #$09 A66E 20 C6 40 JSR $40C6 A671 18 CLC A672 69 14 ADC #$14 ; 確率 2/256 で 20〜28 A674 80 08 BRA $A67E A676 A9 0A LDA #$0A A678 20 C6 40 JSR $40C6 A67B 18 CLC A67C 69 32 ADC #$32 ; 確率 0/256 で 50〜59 A67E 8D 5E AC STA $AC5E レベルアップ時の特性値の変化 各特性値は約 (((20 - 特性値) * 5 + 種族補正 + 職業補正 + 性別補正) mod 256) % で増加し、(成長率が 100 % 未満の場合は)確率 8/256 で減少します。 上記計算式の関係で、成長限界は min{20 + 成長補正/5, 種族の限界値} となります。(初期値が成長限界を超えている場合を除く) 成長限界を超えている特性値は(少なくとも、種族の限界値以下の範囲であれば)減少しません。(むしろ、100% 増加します) 種族補正 STR I.Q. PIE VIT AGI LUC HUMAN 5 5 - 5 5 5 ELF - 5 5 - - - DWARF 5 - 5 - - - GNOME - - 5 - 5 - HOBBIT - - - - 5 5 職業補正 STR I.Q. PIE VIT AGI LUC FIGHTER 10 - - 5 - - MAGE - 10 - - - - PRIEST - - 10 - - - THIEF - - - - 10 5 BISHOP - 5 5 - - - SAMURAI 10 5 - 5 - - LORD 10 - 5 5 - - NINJA - - - - 10 10 性別補正 STR I.Q. PIE VIT AGI LUC MALE 5 - - 5 - 5 FEMALE - 5 5 - 5 - 補足 このゲームでは乱数 0〜(A-1) は (8 bit 乱数) % A により取得されるので、正確な成長確率は以下となります。 成長率表記 正確な成長確率 0 % 0/256 (0.00 %) 5 % 15/256 (5.86 %) 10 % 30/256 (11.72 %) 15 % 45/256 (17.58 %) 20 % 60/256 (23.44 %) 25 % 75/256 (29.30 %) 30 % 90/256 (35.16 %) 35 % 105/256 (41.02 %) 40 % 120/256 (46.88 %) 45 % 135/256 (52.73 %) 50 % 150/256 (58.59 %) 55 % 165/256 (64.45 %) 60 % 176/256 (68.75 %) 65 % 186/256 (72.66 %) 70 % 196/256 (76.56 %) 75 % 206/256 (80.47 %) 80 % 216/256 (84.38 %) 85 % 226/256 (88.28 %) 90 % 236/256 (92.19 %) 95 % 246/256 (96.09 %) 100 % 256/256 (100.00 %) ソース A3E2 AE CA A0 LDX $A0CA A3E5 20 77 A5 JSR $A577 A3E8 9C FD A4 STZ $A4FD A3EB 9C FE A4 STZ $A4FE A3EE AE FD A4 LDX $A4FD A3F1 38 SEC A3F2 A9 14 LDA #$14 A3F4 FD 99 A5 SBC $A599,X ; 特性値 A3F7 8D FC A4 STA $A4FC A3FA 0A ASL A A3FB 0A ASL A A3FC 18 CLC A3FD 6D FC A4 ADC $A4FC A400 8D FC A4 STA $A4FC ; (20 - 特性値) * 5 A403 AE CA A0 LDX $A0CA A406 A0 02 LDY #$02 A408 20 F0 40 JSR $40F0 A40B C2 CLY A40C B1 20 LDA ($20),Y A40E 4A LSR A A40F 4A LSR A A410 4A LSR A A411 29 07 AND #$07 A413 0A ASL A A414 8D B0 39 STA $39B0 A417 0A ASL A A418 18 CLC A419 6D B0 39 ADC $39B0 A41C 18 CLC A41D 6D FD A4 ADC $A4FD A420 AA TAX A421 18 CLC A422 AD FC A4 LDA $A4FC A425 7D FF A4 ADC $A4FF,X ; 種族補正 A428 8D FC A4 STA $A4FC A42B C2 CLY A42C B1 20 LDA ($20),Y A42E 29 07 AND #$07 A430 0A ASL A A431 8D B0 39 STA $39B0 A434 0A ASL A A435 18 CLC A436 6D B0 39 ADC $39B0 A439 18 CLC A43A 6D FD A4 ADC $A4FD A43D AA TAX A43E 18 CLC A43F AD FC A4 LDA $A4FC A442 7D 1D A5 ADC $A51D,X ; 職業補正 A445 8D FC A4 STA $A4FC A448 AE CA A0 LDX $A0CA A44B A0 22 LDY #$22 A44D 20 F0 40 JSR $40F0 A450 B2 20 LDA ($20) ; 性別 A452 29 80 AND #$80 A454 0A ASL A A455 2A ROL A A456 0A ASL A A457 8D B0 39 STA $39B0 A45A 0A ASL A A45B 18 CLC A45C 6D B0 39 ADC $39B0 A45F 18 CLC A460 6D FD A4 ADC $A4FD A463 AA TAX A464 18 CLC A465 AD FC A4 LDA $A4FC A468 7D 4D A5 ADC $A54D,X ; 性別補正 A46B 8D FC A4 STA $A4FC A46E A9 64 LDA #$64 A470 20 C6 40 JSR $40C6 A473 CD FC A4 CMP $A4FC A476 B0 2E BCS $A4A6 ; 乱数 0〜99 が成長率以上だった場合、成長しない A478 AE CA A0 LDX $A0CA A47B A0 02 LDY #$02 A47D 20 F0 40 JSR $40F0 A480 B2 20 LDA ($20) A482 4A LSR A A483 4A LSR A A484 4A LSR A A485 29 07 AND #$07 A487 0A ASL A A488 8D B0 39 STA $39B0 A48B 0A ASL A A48C 18 CLC A48D 6D B0 39 ADC $39B0 A490 18 CLC A491 6D FD A4 ADC $A4FD A494 AA TAX A495 BD 59 A5 LDA $A559,X ; 限界値 A498 AE FD A4 LDX $A4FD A49B DD 99 A5 CMP $A599,X A49E F0 1E BEQ $A4BE A4A0 FE 99 A5 INC $A599,X A4A3 62 CLA A4A4 80 0C BRA $A4B2 A4A6 C9 60 CMP #$60 A4A8 90 14 BCC $A4BE ; 乱数が 96 未満であれば、低下しない A4AA AE FD A4 LDX $A4FD A4AD DE 99 A5 DEC $A599,X A4B0 A9 01 LDA #$01 A4B2 AE FD A4 LDX $A4FD A4B5 AC FE A4 LDY $A4FE A4B8 20 CE AB JSR $ABCE A4BB EE FE A4 INC $A4FE A4BE EE FD A4 INC $A4FD A4C1 AE FD A4 LDX $A4FD A4C4 E0 06 CPX #$06 A4C6 F0 03 BEQ $A4CB A4C8 4C EE A3 JMP $A3EE A4CB 82 CLX A4CC BD 99 A5 LDA $A599,X A4CF C9 03 CMP #$03 A4D1 90 20 BCC $A4F3 A4D3 E8 INX A4D4 E0 06 CPX #$06 A4D6 D0 F4 BNE $A4CC ... レベルアップ時の最大 H.P. レベルアップ後の最大 H.P は以下の式で計算されます max{ (LV)d(職業の成長値) + 職業の基本値 + (LV/2) * VIT 補正, (現 最大 H.P.) + 1 } VIT 補正 VIT mod 16 VIT 補正値 14〜15 3 12〜13 2 9〜11 1 0〜8 0 ※ 何故か VIT を 16 で割った余りに基づいて補正が計算されるため、VIT 16 以上では補正がつきません。 職業ごとの成長値と基本値 職業 成長値 基本値 FIGHTER 8 8 MAGE 3 3 PRIEST 7 7 THIEF 5 5 BISHOP 6 6 SAMURAI 8 8 LORD 8 8 NINJA 5 5 ソース A59F 9C EB A6 STZ $A6EB A5A2 9C EC A6 STZ $A6EC A5A5 AE CA A0 LDX $A0CA A5A8 A0 01 LDY #$01 A5AA 20 F0 40 JSR $40F0 A5AD B2 20 LDA ($20) A5AF 8D ED A6 STA $A6ED ; LV 下位 8 bit A5B2 8D EF A6 STA $A6EF A5B5 A0 01 LDY #$01 A5B7 B1 20 LDA ($20),Y ; LV 上位 8 bit A5B9 8D EE A6 STA $A6EE A5BC 8D F0 A6 STA $A6F0 A5BF AD F0 A6 LDA $A6F0 A5C2 4A LSR A A5C3 8D F0 A6 STA $A6F0 A5C6 AD EF A6 LDA $A6EF A5C9 6A ROR A A5CA 8D EF A6 STA $A6EF ; LV / 2 A5CD AE CA A0 LDX $A0CA A5D0 A0 02 LDY #$02 A5D2 20 F0 40 JSR $40F0 A5D5 C2 CLY A5D6 B1 20 LDA ($20),Y A5D8 29 07 AND #$07 A5DA 0A ASL A A5DB AA TAX A5DC BD 00 A7 LDA $A700,X A5DF 8D F8 A6 STA $A6F8 ; 職業 HP 成長値 A5E2 DA PHX A5E3 AD F8 A6 LDA $A6F8 A5E6 20 C6 40 JSR $40C6 A5E9 18 CLC A5EA 69 01 ADC #$01 ; 1 〜 HP 成長値 A5EC 18 CLC A5ED 6D EB A6 ADC $A6EB A5F0 8D EB A6 STA $A6EB A5F3 A9 00 LDA #$00 A5F5 6D EC A6 ADC $A6EC A5F8 8D EC A6 STA $A6EC A5FB 38 SEC A5FC AD ED A6 LDA $A6ED A5FF E9 01 SBC #$01 A601 8D ED A6 STA $A6ED A604 AD EE A6 LDA $A6EE A607 E9 00 SBC #$00 A609 8D EE A6 STA $A6EE A60C AD ED A6 LDA $A6ED A60F 0D EE A6 ORA $A6EE A612 D0 CF BNE $A5E3 ; LV 回繰り返す A614 FA PLX A615 BD 01 A7 LDA $A701,X ; 基本値 A618 18 CLC A619 6D EB A6 ADC $A6EB A61C 8D EB A6 STA $A6EB A61F A9 00 LDA #$00 A621 6D EC A6 ADC $A6EC A624 8D EC A6 STA $A6EC A627 9C F1 A6 STZ $A6F1 A62A 9C F2 A6 STZ $A6F2 A62D 9C F3 A6 STZ $A6F3 A630 9C F4 A6 STZ $A6F4 A633 AE CA A0 LDX $A0CA A636 A0 06 LDY #$06 A638 20 F0 40 JSR $40F0 A63B C2 CLY A63C B1 20 LDA ($20),Y A63E 29 0F AND #$0F ; (生命力 mod 16) A640 82 CLX A641 18 CLC A642 69 03 ADC #$03 ; (生命力 mod 16) + 3 A644 C9 0C CMP #$0C A646 90 18 BCC $A660 ; 12 未満 A648 E8 INX A649 C9 0F CMP #$0F A64B 90 06 BCC $A653 ; 15 未満 A64D E8 INX A64E C9 11 CMP #$11 A650 90 01 BCC $A653 ; 17 未満 A652 E8 INX A653 8E F5 A6 STX $A6F5 ; VIT ボーナス A656 9C F6 A6 STZ $A6F6 A659 A2 F9 LDX #$F9 A65B A0 A6 LDY #$A6 A65D 20 8D 40 JSR $408D ; $A6F1 ← (VIT ボーナス) * (LV / 2) A660 18 CLC A661 AD EB A6 LDA $A6EB A664 6D F1 A6 ADC $A6F1 A667 8D EB A6 STA $A6EB A66A AD EC A6 LDA $A6EC A66D 6D F2 A6 ADC $A6F2 A670 8D EC A6 STA $A6EC A673 AE CA A0 LDX $A0CA ; 以下、現在の最大 H.P. と比較など A676 A0 09 LDY #$09 A678 20 F0 40 JSR $40F0 A67B A0 01 LDY #$01 A67D B1 20 LDA ($20),Y A67F CD EC A6 CMP $A6EC A682 90 1B BCC $A69F A684 D0 08 BNE $A68E A686 88 DEY A687 B1 20 LDA ($20),Y A689 CD EB A6 CMP $A6EB A68C 90 11 BCC $A69F A68E C2 CLY A68F 18 CLC A690 B1 20 LDA ($20),Y A692 69 01 ADC #$01 A694 8D EB A6 STA $A6EB A697 C8 INY A698 B1 20 LDA ($20),Y A69A 69 00 ADC #$00 A69C 8D EC A6 STA $A6EC A69F AD EB A6 LDA $A6EB A6A2 8D E9 A6 STA $A6E9 A6A5 AD EC A6 LDA $A6EC A6A8 8D EA A6 STA $A6EA A6F9 02 F5 A6 EF A6 F1 A6 A700 08 08 03 03 07 07 05 05 06 06 08 08 08 08 05 05 呪文習得 LV が上がった際に、以下の条件を満たす場合のみ、呪文の回数が更新されます。 職業 条件 回数の更新対象 MAGE LV 29 以下 MAGE 呪文 PRIEST LV 29 以下 PRIEST 呪文 BISHOP LV 41 以下 MAGE, PRIEST 呪文 SAMURAI LV 36 以下 MAGE 呪文 LORD LV 36 以下 PRIEST 呪文 呪文は以下の職業についている場合にのみ習得判定があります MAGE の呪文 MAGE, BISHOP, SAMURAI のみ PRIEST の呪文 PRIEST, BISHOP, LORD のみ レベル L の呪文は そのレベルの回数が 0 でない場合のみ習得判定があり、各呪文の習得率は以下のようになっています LEVEL 呪文 習得設定値 習得確率 1 HALITO 60 176/256 (68.75 %) 1 MOGREF 40 120/256 (46.88 %) 1 KATINO 100 256/256 (100.00 %) 1 DUMAPIC 50 150/256 (58.59 %) 2 DILTO 60 176/256 (68.75 %) 2 SOPIC 100 256/256 (100.00 %) 2 MOLITO 30 90/256 (35.16 %) 3 TZALIK 50 150/256 (58.59 %) 3 MORLIS 50 150/256 (58.59 %) 3 MAHALITO 100 256/256 (100.00 %) 4 ZILWAN 50 150/256 (58.59 %) 4 DALTO 100 256/256 (100.00 %) 4 LAHALITO 30 90/256 (35.16 %) 4 MASOPIC 100 256/256 (100.00 %) 5 MAMORLIS 50 150/256 (58.59 %) 5 MAKANITO 40 120/256 (46.88 %) 5 MADALTO 100 256/256 (100.00 %) 6 LAKANITO 40 120/256 (46.88 %) 6 LADALTO 100 256/256 (100.00 %) 6 HAMAN 40 120/256 (46.88 %) 7 MALOR 100 256/256 (100.00 %) 7 MAHAMAN 40 120/256 (46.88 %) 7 TILTOWAIT 50 150/256 (58.59 %) LEVEL 呪文 習得設定値 習得確率 1 KALKI 60 176/256 (68.75 %) 1 DIOS 100 256/256 (100.00 %) 1 BADIOS 60 176/256 (68.75 %) 1 CALFO 100 256/256 (100.00 %) 1 PORFIC 50 150/256 (58.59 %) 2 MATU 40 120/256 (46.88 %) 2 MILWA 40 120/256 (46.88 %) 2 MANIFO 70 196/256 (76.56 %) 2 MONTINO 50 150/256 (58.59 %) 3 DIAL 100 256/256 (100.00 %) 3 BADIAL 60 176/256 (68.75 %) 3 DIALKO 100 256/256 (100.00 %) 3 LATUMAPIC 50 150/256 (58.59 %) 4 BAMATU 40 120/256 (46.88 %) 4 LOMILWA 40 120/256 (46.88 %) 4 LITOKAN 40 120/256 (46.88 %) 4 LATUMOFIS 40 120/256 (46.88 %) 4 BADI 40 120/256 (46.88 %) 5 DIALMA 100 256/256 (100.00 %) 5 BADIALMA 60 176/256 (68.75 %) 5 DI 50 150/256 (58.59 %) 5 MAPORFIC 60 176/256 (68.75 %) 6 LORTO 60 176/256 (68.75 %) 6 MADI 100 256/256 (100.00 %) 6 MABADI 20 60/256 (23.44 %) 7 LOKTOFEIT 50 150/256 (58.59 %) 7 MALIKTO 60 176/256 (68.75 %) 7 KADORTO 100 256/256 (100.00 %) ソース D835 8E 03 DA STX $DA03 D838 A0 01 LDY #$01 D83A 20 F0 40 JSR $40F0 D83D A0 01 LDY #$01 D83F B1 20 LDA ($20),Y ; LV 上位 8 bit D841 F0 07 BEQ $D84A D843 A9 FF LDA #$FF D845 8D 04 DA STA $DA04 D848 80 05 BRA $D84F D84A B2 20 LDA ($20) D84C 8D 04 DA STA $DA04 ; LV 下位 8 bit D84F AE 03 DA LDX $DA03 D852 A0 02 LDY #$02 D854 20 F0 40 JSR $40F0 D857 B2 20 LDA ($20) D859 29 07 AND #$07 D85B 8D 05 DA STA $DA05 ; 職業 D85E 0A ASL A D85F 0A ASL A D860 AA TAX D861 BD 13 DA LDA $DA13,X D864 8D 06 DA STA $DA06 D867 C9 FF CMP #$FF D869 D0 02 BNE $D86D D86B 62 CLA D86C 60 RTS ; ; 呪文の回数更新 習得 ; D86D BD 14 DA LDA $DA14,X D870 CD 04 DA CMP $DA04 ; min(255, LV) D873 90 37 BCC $D8AC ; ; 回数更新 ; D875 BD 15 DA LDA $DA15,X D878 85 50 STA $50 D87A BD 16 DA LDA $DA16,X D87D 85 51 STA $51 ... D898 AD 06 DA LDA $DA06 D89B 4A LSR A D89C 48 PHA D89D 90 04 BCC $D8A3 D89F 62 CLA D8A0 20 37 D9 JSR $D937 ; MAGE 回数 D8A3 68 PLA D8A4 4A LSR A D8A5 90 05 BCC $D8AC D8A7 A9 01 LDA #$01 D8A9 20 37 D9 JSR $D937 ; PRIEST 回数 ; ; 呪文習得 ; D8AC 9C 08 DA STZ $DA08 D8AF AD 06 DA LDA $DA06 D8B2 4A LSR A D8B3 48 PHA D8B4 90 04 BCC $D8BA D8B6 62 CLA D8B7 20 81 D9 JSR $D981 ; MAGE 呪文 D8BA 68 PLA D8BB 4A LSR A D8BC 90 05 BCC $D8C3 D8BE A9 01 LDA #$01 D8C0 20 81 D9 JSR $D981 ; PRIEST 呪文 D8C3 62 CLA ... D8CD 60 RTS ; ; 呪文習得 ; D981 8D 0F 3A STA $3A0F D984 C9 00 CMP #$00 D986 D0 0A BNE $D992 ; D988 AE 03 DA LDX $DA03 D98B A0 10 LDY #$10 D98D 20 F0 40 JSR $40F0 D990 80 08 BRA $D99A ; D992 AE 03 DA LDX $DA03 D995 A0 12 LDY #$12 D997 20 F0 40 JSR $40F0 ; D99A C2 CLY D99B 5A PHY D99C B1 20 LDA ($20),Y ; 呪文の回数 D99E F0 5C BEQ $D9FC ... D9BA C2 CLY D9BB 5A PHY D9BC AC 0F 3A LDY $3A0F D9BF D0 05 BNE $D9C6 D9C1 BD 19 DD LDA $DD19,X ; MAGE 呪文確率 D9C4 80 03 BRA $D9C9 D9C6 BD 43 DD LDA $DD43,X ; PRIEST 呪文確率 D9C9 7A PLY D9CA C9 FF CMP #$FF D9CC F0 2E BEQ $D9FC D9CE 8D 01 3A STA $3A01 D9D1 5A PHY D9D2 A9 01 LDA #$01 D9D4 C0 00 CPY #$00 D9D6 F0 04 BEQ $D9DC D9D8 0A ASL A D9D9 88 DEY D9DA 80 F8 BRA $D9D4 D9DC 8D 02 3A STA $3A02 D9DF 7A PLY D9E0 32 50 AND ($50) D9E2 D0 14 BNE $D9F8 ; 習得済みの場合飛ばす D9E4 A9 64 LDA #$64 D9E6 20 C6 40 JSR $40C6 D9E9 CD 01 3A CMP $3A01 D9EC B0 0A BCS $D9F8 ; 判定 D9EE AD 02 3A LDA $3A02 D9F1 12 50 ORA ($50) D9F3 92 50 STA ($50) D9F5 EE 08 DA INC $DA08 D9F8 C8 INY D9F9 E8 INX D9FA 80 BF BRA $D9BB D9FC 7A PLY D9FD C8 INY D9FE C0 07 CPY #$07 DA00 D0 99 BNE $D99B DA02 60 RTS DA13 FF FF FF FF 01 1D 33 DA 02 1D 33 DA FF FF FF FF 03 29 FE DA 01 24 1D DC 02 24 1D DC FF FF FF FF DD19 3C 28 64 32 FF FF 3C 64 1E FF FF FF 32 32 64 FF FF FF 32 64 1E 64 FF FF 32 28 64 FF FF FF 28 64 28 FF FF FF 64 28 32 FF FF FF 3C 64 3C 64 32 FF 28 28 46 32 FF FF 64 3C 64 32 FF FF 28 28 28 28 28 FF 64 3C 32 3C FF FF 3C 64 14 FF FF FF 32 3C 64 FF FF FF 蘇生率 成功率は死亡・灰に依存しないようです。 手段 成功条件 確率 カント寺院 (乱数 0〜98) 90 238/256 (92.04 %) ディ (乱数 0〜99) (20 + 対象の VIT) 約 (20 + 対象の VIT) % カドルト (乱数 0〜99) (50 + 対象の VIT) 約 (50 + 対象の VIT) % ソース ; ; ディ ; 982E 5A PHY 982F AE 40 2B LDX $2B40 9832 A9 03 LDA #$03 9834 20 17 41 JSR $4117 9837 18 CLC 9838 69 14 ADC #$14 ; 20 + 対象の VIT 983A 80 0D BRA $9849 ; ; カドルト ; 983C DA PHX 983D 5A PHY 983E AE 40 2B LDX $2B40 9841 A9 03 LDA #$03 9843 20 17 41 JSR $4117 9846 18 CLC 9847 69 32 ADC #$32 ; 50 + 対象の VIT ; 9849 7A PLY 984A FA PLX 984B 20 ED 40 JSR $40ED 984E 90 10 BCC $9860 ... 985F 38 SEC 9860 60 RTS ; ; カント寺院 ; A086 A9 63 LDA #$63 A088 20 C6 40 JSR $40C6 A08B C9 5A CMP #$5A A08D B0 08 BCS $A097 ; (乱数 0〜98) 90 ? A08F AE A5 A1 LDX $A1A5 鑑定 (乱数 0〜99) 境界値 であれば、鑑定に成功します。 LV mod 256 境界値 〜7 33 8〜95 min(96, LV + AGI * 3) 96〜 96 鑑定に失敗した場合 呪われたアイテムだった場合 確率 30/256 でそのアイテムを装備します。(AFRAID にはならない) 確率 226/256 で次の AFRAID 判定を行います。 それ以外の場合は、99/256 で AFRAID 状態になります。 ソース AC06 AE 16 A3 LDX $A316 AC09 A0 07 LDY #$07 AC0B 20 F0 40 JSR $40F0 AC0E B2 20 LDA ($20) AC10 8D 30 AD STA $AD30 AC13 0A ASL A AC14 18 CLC AC15 6D 30 AD ADC $AD30 AC18 8D 30 AD STA $AD30 ; AGI * 3 AC1B AE 16 A3 LDX $A316 AC1E A0 01 LDY #$01 AC20 20 F0 40 JSR $40F0 AC23 B2 20 LDA ($20) ; LV mod 256 AC25 C9 08 CMP #$08 AC27 B0 04 BCS $AC2D AC29 A9 21 LDA #$21 AC2B 80 0E BRA $AC3B AC2D C9 60 CMP #$60 AC2F B0 08 BCS $AC39 AC31 18 CLC AC32 6D 30 AD ADC $AD30 AC35 C9 60 CMP #$60 AC37 90 02 BCC $AC3B AC39 A9 60 LDA #$60 AC3B 8D 30 AD STA $AD30 AC3E A9 64 LDA #$64 AC40 20 C6 40 JSR $40C6 AC43 CD 30 AD CMP $AD30 AC46 B0 3D BCS $AC85 ; 失敗 ... AC85 AE 16 A3 LDX $A316 AC88 A0 15 LDY #$15 AC8A 20 F0 40 JSR $40F0 AC8D AD 2F AD LDA $AD2F AC90 0A ASL A AC91 0A ASL A AC92 18 CLC AC93 6D 2F AD ADC $AD2F AC96 A8 TAY AC97 C8 INY AC98 B1 20 LDA ($20),Y AC9A 29 10 AND #$10 AC9C F0 17 BEQ $ACB5 ; 呪われていない AC9E A9 64 LDA #$64 ACA0 20 C6 40 JSR $40C6 ACA3 C9 0A CMP #$0A ACA5 B0 0E BCS $ACB5 ; 装備しない ACA7 A9 40 LDA #$40 ACA9 11 20 ORA ($20),Y ACAB 91 20 STA ($20),Y ... ACB5 A9 64 LDA #$64 ACB7 20 C6 40 JSR $40C6 ACBA C9 21 CMP #$21 ACBC B0 36 BCS $ACF4 ; AFRAID にならない ACBE AE 16 A3 LDX $A316 ACC1 A0 0F LDY #$0F ACC3 20 F0 40 JSR $40F0 ACC6 B2 20 LDA ($20) ACC8 09 01 ORA #$01 ACCA 92 20 STA ($20) ... エンカウント確率 玄室 確率 216/256 その他の動作 確率 6/256 ソース ; ; エンカウント ; A549 AE 0A 38 LDX $380A A54C AC 0B 38 LDY $380B A54F 20 7B A4 JSR $A47B A552 A2 01 LDX #$01 A554 A9 50 LDA #$50 A556 DF 63 03 BBS5 $63,$A55C A559 CA DEX A55A A9 02 LDA #$02 A55C 8E 0A 3A STX $3A0A A55F 20 ED 40 JSR $40ED A562 60 RTS 友好的なモンスターの確率 ALARM の場合 0% 固定戦闘で、 敵のその階層での登録番号が 6 の場合 90/256 (#1 の Murphy s Ghost が該当) それ以外の場合 0% それ以外の場合 30/256 ソース C182 9C 0D 39 STZ $390D C185 AD 06 3A LDA $3A06 ; アラーム C188 D0 19 BNE $C1A3 C18A AD 08 3A LDA $3A08 ; 固定戦闘 C18D F0 0D BEQ $C19C C18F AD 11 39 LDA $3911 C192 29 7F AND #$7F C194 C9 06 CMP #$06 C196 D0 0B BNE $C1A3 C198 A9 1E LDA #$1E C19A 80 02 BRA $C19E C19C A9 0A LDA #$0A C19E 20 ED 40 JSR $40ED C1A1 90 02 BCC $C1A5 C1A3 18 CLC C1A4 60 RTS 味方先制・敵先制率 PRIEST RING を所持しており、先頭のモンスターに DISPEL が有効の場合 100 % 味方先制 それ以外の場合 確率 15/256 で味方先制 確率 10/256 で敵先制 ソース 9068 A9 AC LDA #$AC ; PRIEST RING 906A 20 0F 9B JSR $9B0F 906D B0 10 BCS $907F 906F AD 11 39 LDA $3911 9072 29 7F AND #$7F 9074 A0 0D LDY #$0D 9076 20 9B 41 JSR $419B 9079 90 04 BCC $907F ; DISPEL が有効でない 907B A2 01 LDX #$01 ; 味方先制 907D 80 10 BRA $908F 907F A9 64 LDA #$64 9081 20 C6 40 JSR $40C6 9084 C9 05 CMP #$05 9086 90 F3 BCC $907B 9088 82 CLX ; (通常) 9089 C9 5F CMP #$5F 908B 90 02 BCC $908F 908D A2 02 LDX #$02 ; 敵先制 ... モンスター出現数補正 敵の出現数は A + (乱数 0〜(B-1)) という形式で計算されますが、味方パーティの最大 LV が低い場合には (乱数 0〜(B-1)) の箇所に以下の補正がかかります。 味方の最大 LV 乱数 0〜(B-1) に対する補正 〜2 結果を 1/4 にする 〜4 結果を 1/2 にする 5〜 変化なし ソース A1B3 A0 05 LDY #$05 A1B5 20 58 A0 JSR $A058 A1B8 B2 27 LDA ($27) A1BA C9 11 CMP #$11 A1BC D0 04 BNE $A1C2 ; A = 1, B = 1 ではない A1BE A9 01 LDA #$01 A1C0 38 SEC A1C1 60 RTS A1C2 48 PHA A1C3 29 F0 AND #$F0 A1C5 4A LSR A A1C6 4A LSR A A1C7 4A LSR A A1C8 4A LSR A A1C9 20 C6 40 JSR $40C6 A1CC 85 7F STA $7F ; 乱数 0〜(B-1) A1CE 62 CLA A1CF 9C 4B 2B STZ $2B4B A1D2 9C 4C 2B STZ $2B4C A1D5 48 PHA A1D6 A2 46 LDX #$46 A1D8 A0 2B LDY #$2B A1DA 20 F9 40 JSR $40F9 A1DD 38 SEC A1DE AD 46 2B LDA $2B46 A1E1 ED 4B 2B SBC $2B4B A1E4 AD 47 2B LDA $2B47 A1E7 ED 4C 2B SBC $2B4C A1EA 90 0C BCC $A1F8 A1EC AD 46 2B LDA $2B46 A1EF 8D 4B 2B STA $2B4B A1F2 AD 47 2B LDA $2B47 A1F5 8D 4C 2B STA $2B4C A1F8 68 PLA A1F9 1A INC A1FA CD 00 38 CMP $3800 A1FD 90 D6 BCC $A1D5 A1FF AD 4C 2B LDA $2B4C ; 最大 LV = 256 A202 D0 0F BNE $A213 A204 AD 4B 2B LDA $2B4B A207 C9 05 CMP #$05 A209 B0 08 BCS $A213 ; 最大 LV = 5 A20B 46 7F LSR $7F A20D C9 03 CMP #$03 A20F B0 02 BCS $A213 ; 最大 LV = 3 A211 46 7F LSR $7F A213 68 PLA A214 29 0F AND #$0F ; 最低出現数 A216 18 CLC A217 65 7F ADC $7F A219 18 CLC A21A 60 RTS モンスターの正体の確定率 LATUMAPIC を唱えている場合 100 % それ以外の場合 約 ((パーティの I.Q. の最大値) × 3) % の確率で確定できる。 ソース 89F2 48 PHA 89F3 DA PHX 89F4 5A PHY 89F5 18 CLC 89F6 AD 0E 38 LDA $380E 89F9 D0 0A BNE $8A05 ; LATUMAPIC 89FB A9 01 LDA #$01 ; I.Q. 89FD 44 0A BSR $8A09 89FF 0A ASL A 8A00 65 6F ADC $6F 8A02 20 ED 40 JSR $40ED ; (乱数 0〜99) I.Q * 3 ; 8A05 7A PLY 8A06 FA PLX 8A07 68 PLA 8A08 60 RTS ; ; パーティ中の特性値 A の最大値を取得 ; 8A09 DA PHX 8A0A 64 6F STZ $6F 8A0C 82 CLX 8A0D DA PHX 8A0E 48 PHA 8A0F 20 17 41 JSR $4117 8A12 C5 6F CMP $6F 8A14 90 02 BCC $8A18 8A16 85 6F STA $6F 8A18 68 PLA 8A19 FA PLX 8A1A E8 INX 8A1B EC 00 38 CPX $3800 8A1E 90 ED BCC $8A0D 8A20 A5 6F LDA $6F 8A22 FA PLX 8A23 60 RTS RUN 成功率 (味方の最大 LV) = (敵の最大 LV) の場合 確率 236/256 それ以外の場合 確率 150/256 ソース ; ; 逃げる ; 93E7 38 SEC 93E8 AD D3 39 LDA $39D3 93EB D0 1A BNE $9407 93ED 44 19 BSR $9408 ; 味方の最大 LV 93EF 44 49 BSR $943A ; 敵の最大 LV 93F1 38 SEC 93F2 AD 4B 2B LDA $2B4B 93F5 ED 50 2B SBC $2B50 93F8 AD 4C 2B LDA $2B4C 93FB ED 51 2B SBC $2B51 93FE A9 5A LDA #$5A ; 90 9400 B0 02 BCS $9404 9402 A9 32 LDA #$32 9404 20 ED 40 JSR $40ED ; 50 9407 60 RTS DISPEL 成功率 対象が識別済み かつ DISPEL 有効なモンスターの場合のみ、確率 (LV + 敵に設定された成功率) % で成功する。 ソース ; ; DISPEL ; D179 A6 81 LDX $81 D17B BD 12 39 LDA $3912,X D17E F0 61 BEQ $D1E1 ; D180 AD 44 2B LDA $2B44 D183 10 05 BPL $D18A ; 識別済みの場合のみ判定 D185 A9 68 LDA #$68 D187 4C B4 40 JMP $40B4 D18A A0 0D LDY #$0D D18C 20 9B 41 JSR $419B D18F 90 F4 BCC $D185 ; DISPEL が有効でない D191 8D 4B 2B STA $2B4B D194 AD 40 2B LDA $2B40 D197 A2 46 LDX #$46 D199 A0 2B LDY #$2B D19B 20 F9 40 JSR $40F9 D19E 18 CLC D19F AD 4B 2B LDA $2B4B D1A2 6D 46 2B ADC $2B46 D1A5 8D 46 2B STA $2B46 D1A8 62 CLA D1A9 6D 47 2B ADC $2B47 D1AC D0 08 BNE $D1B6 ; (LV + 境界値) = 256 D1AE AD 46 2B LDA $2B46 D1B1 20 ED 40 JSR $40ED D1B4 B0 CF BCS $D185 ... D1E1 60 RTS 行動順 他機種と異なり、行動順にはキャラクタの並びのみが影響しており、AGI は影響しません。 モンスターはグループ単位で行動順を決めています。 以下のような手順で行動順を決定しています。 味方の行動順、敵パーティの行動順を並びの順とする。 味方の行動順を並び替える (※)。 敵パーティの行動順を並び替える。 味方・敵パーティの行動順を(味方が先になるように)結合し、敵味方混合状態で行動順を 2 回並び替える。 ※ "並び替える" とは完全なシャッフル操作ではなく、「i = 1, 2, ..., (人数-1) について、確率 90/256 で i 番目と (i+1) 番目の行動者を入れ替える」という操作になっています。 つまり、味方 6 人(もしくは n 人)パーティの場合、最低でも 4 人(n-2 人)は敵に先制を取ることができます。 ソース C1FE 62 CLA C1FF AA TAX C200 9D A2 2B STA $2BA2,X ; 味方の行動順初期化 C203 48 PHA C204 09 80 ORA #$80 C206 9D A8 2B STA $2BA8,X ; 敵パーティの行動順初期化 C209 68 PLA C20A 1A INC C20B C9 06 CMP #$06 C20D 90 F0 BCC $C1FF C20F A2 A2 LDX #$A2 C211 A0 2B LDY #$2B C213 AD 00 38 LDA $3800 C216 44 35 BSR $C24D ; 味方の行動順を並び替える C218 A2 A8 LDX #$A8 C21A A0 2B LDY #$2B C21C AD 10 39 LDA $3910 C21F 44 2C BSR $C24D ; 敵パーティの行動順を並び替える C221 82 CLX C222 BD A2 2B LDA $2BA2,X C225 9D 93 39 STA $3993,X C228 E8 INX C229 EC 00 38 CPX $3800 C22C 90 F4 BCC $C222 C22E C2 CLY C22F B9 A8 2B LDA $2BA8,Y C232 9D 93 39 STA $3993,X C235 E8 INX C236 C8 INY C237 CC 10 39 CPY $3910 C23A 90 F3 BCC $C22F C23C 8E 92 39 STX $3992 ; 並びを結合する C23F 8A TXA C240 A2 93 LDX #$93 C242 A0 39 LDY #$39 C244 44 07 BSR $C24D ; 全体で並び替える C246 AD 92 39 LDA $3992 C249 A2 93 LDX #$93 C24B A0 39 LDY #$39 ; 再び、全体で並び替える C24D 85 8D STA $8D C24F 3A DEC C250 F0 20 BEQ $C272 C252 86 8E STX $8E C254 84 8F STY $8F C256 A0 01 LDY #$01 C258 A9 1E LDA #$1E C25A 20 ED 40 JSR $40ED C25D B0 0E BCS $C26D C25F B1 8E LDA ($8E),Y C261 AA TAX C262 88 DEY C263 B1 8E LDA ($8E),Y C265 C8 INY C266 91 8E STA ($8E),Y C268 88 DEY C269 8A TXA C26A 91 8E STA ($8E),Y C26C C8 INY C26D C8 INY C26E C4 8D CPY $8D C270 90 E6 BCC $C258 C272 60 RTS EXP, GOLD 勝利後に入手できる EXP, GOLD 以下のように計算されます EXP 敵パーティ毎の (1体の EXP + ランダム値)×(倒した数)を総和し、パーティの人数で割ったものです。 ランダム値は以下のようになっています 1 体のEXP ランダム値 256 未満 0〜9 256 以上 0〜99 GOLD 倒した敵の (LV * 4) mod 256 の総和を、パーティの人数で割ったものです。0 の場合は 1 とします。 ; ; EXP ; A0F3 A0 0D LDY #$0D A0F5 20 58 A0 JSR $A058 A0F8 A0 02 LDY #$02 A0FA B1 27 LDA ($27),Y A0FC 99 4B 2B STA $2B4B,Y A0FF 88 DEY A100 10 F8 BPL $A0FA A102 A2 64 LDX #$64 A104 AD 4D 2B LDA $2B4D A107 0D 4C 2B ORA $2B4C A10A D0 02 BNE $A10E ; EXP = 256 かどうか A10C A2 0A LDX #$0A A10E 8A TXA A10F 20 C6 40 JSR $40C6 A112 18 CLC A113 6D 4B 2B ADC $2B4B A116 8D 4B 2B STA $2B4B A119 62 CLA A11A 6D 4C 2B ADC $2B4C A11D 8D 4C 2B STA $2B4C A120 62 CLA A121 6D 4D 2B ADC $2B4D A124 8D 4D 2B STA $2B4D A127 9C 4E 2B STZ $2B4E A12A 9C 4F 2B STZ $2B4F A12D 60 RTS ; ; GOLD ; DA8D BD 11 39 LDA $3911,X DA90 29 7F AND #$7F DA92 A0 01 LDY #$01 DA94 20 9B 41 JSR $419B DA97 0A ASL A DA98 0A ASL A DA99 8D 4B 2B STA $2B4B ; LV * 4 ... 宝箱関連 INSPECT 成功/失敗の判定をおこないます。 職業が THIEF, NINJA の場合 約 ((AGI + LUCK) * 2 + (LUCK 補正)) % で成功します。 Luck Luck 補正 0〜13 0 14〜15 1 16〜 2 つまり AGI = 22, LUCK = 27 の場合、100% 成功します。 それ以外の職業の場合 確率 30/256 で、THIEF, NINJA と同等の判定を行います。 確率 226/256 で、失敗となります。 1.で失敗した場合、 確率 236/256 でランダムな罠を表示します。 確率 20/256 で罠に引っかかります。 CALFO 確率 246/256 で成功します。 失敗した場合は、ランダムな罠を表示します。 DISARM 成功/失敗の判定をおこないます。 この判定は INSPECT の 1. の判定と同等です。 失敗した場合、更に以下の成功/失敗の判定を行います LV が 256 以上の場合 無条件で成功となります。 LV が 256 未満の場合 LUCK 20 の場合 約 1 / (22 - 運) の確率で成功します。 LUCK = 20 の場合 約 1 - 1 / (運 - 18) の確率で成功します。 2.でも失敗した場合は失敗となり、確率 216/256 で罠に引っかかります。 ※ 運 27 のキャラクタの場合、職業によらず 少なくとも 90 % 程度で成功となります。 ソース ; ; INSPECT ; DED3 20 87 DD JSR $DD87 ; 確率判定 DED6 90 C1 BCC $DE99 ; 成功した場合 DED8 A9 5A LDA #$5A DEDA 20 ED 40 JSR $40ED DEDD 90 BE BCC $DE9D ; 乱数 0〜99 90? DEDF A5 80 LDA $80 DEE1 F0 05 BEQ $DEE8 DEE3 A9 7B LDA #$7B DEE5 20 B4 40 JSR $40B4 ... ; ; CALFO ; DE94 A9 5F LDA #$5F DE96 20 ED 40 JSR $40ED ; 95% (246/256) DE99 A5 80 LDA $80 DE9B 90 05 BCC $DEA2 DE9D A9 0B LDA #$0B DE9F 20 C6 40 JSR $40C6 ; 0〜A ... ; ; DISARM ; DF0E A5 80 LDA $80 DF10 F0 CD BEQ $DEDF ; 罠なし DF12 20 87 DD JSR $DD87 ; 第 1 判定 DF15 90 13 BCC $DF2A DF17 20 FE DD JSR $DDFE ; 第 2 判定 DF1A 90 0E BCC $DF2A DF1C A9 7A LDA #$7A DF1E 20 B4 40 JSR $40B4 ; (罠をはずすことができなかった) DF21 A9 50 LDA #$50 DF23 20 ED 40 JSR $40ED DF26 B0 1A BCS $DF42 DF28 80 B5 BRA $DEDF ; 乱数 0〜99 80 ... ; ; 第一判定 ; DD87 AE 40 2B LDX $2B40 DD8A 20 0B 41 JSR $410B ; 職業 DD8D C9 03 CMP #$03 DD8F F0 0B BEQ $DD9C DD91 C9 07 CMP #$07 DD93 F0 07 BEQ $DD9C ; DD95 A9 0A LDA #$0A DD97 20 ED 40 JSR $40ED ; 乱数 0〜99 10 DD9A B0 EA BCS $DD86 ; 失敗 ; DD9C AE 40 2B LDX $2B40 DD9F 4C 29 8B JMP $8B29 ; ; THIEF, NINJA の場合 ; 8B29 A9 04 LDA #$04 8B2B 20 17 41 JSR $4117 8B2E 85 6F STA $6F ; AGI 8B30 A9 05 LDA #$05 8B32 20 17 41 JSR $4117 ; LUCK 8B35 48 PHA 8B36 18 CLC 8B37 65 6F ADC $6F 8B39 0A ASL A 8B3A 85 6F STA $6F ; (AGI + LUCK) * 2 8B3C 68 PLA 8B3D C9 0E CMP #$0E 8B3F 90 08 BCC $8B49 8B41 E6 6F INC $6F 8B43 C9 10 CMP #$10 8B45 90 02 BCC $8B49 8B47 E6 6F INC $6F ; (AGI + LUCK) * 2 + (LUCK 補正) 8B49 A5 6F LDA $6F 8B4B 4C ED 40 JMP $40ED ; ; 第 2 判定 ; DDFE AD 40 2B LDA $2B40 DE01 A2 46 LDX #$46 DE03 A0 2B LDY #$2B DE05 20 F9 40 JSR $40F9 ; DE08 AD 47 2B LDA $2B47 ; LV 上位 8 bit DE0B D0 2D BNE $DE3A DE0D AE 40 2B LDX $2B40 DE10 A9 05 LDA #$05 DE12 20 17 41 JSR $4117 DE15 8D 3C DE STA $DE3C ; 運 DE18 C9 14 CMP #$14 DE1A 90 0F BCC $DE2B DE1C 38 SEC DE1D AD 3C DE LDA $DE3C DE20 E9 12 SBC #$12 DE22 20 C6 40 JSR $40C6 ; 1 - 1 / (運 - 18) DE25 C9 01 CMP #$01 DE27 F0 0F BEQ $DE38 DE29 80 0F BRA $DE3A ; DE2B 38 SEC DE2C A9 16 LDA #$16 DE2E ED 3C DE SBC $DE3C DE31 20 C6 40 JSR $40C6 ; 1 / (22 - 運) DE34 C9 01 CMP #$01 DE36 F0 02 BEQ $DE3A DE38 38 SEC DE39 60 RTS DE3A 18 CLC DE3B 60 RTS ダメージ計算 (攻撃回数) = (最大攻撃回数) - 乱数 0〜((最大攻撃回数)/2-1) (最大攻撃回数) = min{22, max{1, LV/5}} + (武器の攻撃回数) (基礎ダメージ) = 乱数 1〜2 (忍者以外の素手の場合) 乱数 1〜7 (忍者の素手の場合) C + 乱数 0〜(B-1) (武器を装備している場合) (例. MURAMASA BLADE は 5〜49) (1ヒットダメージ) = ((基礎ダメージ) × (アイテムの倍打判定 1 or 2) × (対象の睡眠状態判定 1 or 2)) mod 256 アイテムの倍打判定は装備されている武器に加え、以下のアイテムについても判定されます。 アイテム ID アイテム名称 要装備 倍打タイプ 0x4C BLADEofOTAKA Yes すべて 0x61 GARBofLORDS Yes 0x07(悪魔), 0x06(不死), 0x0a(獣人) 0x9F GLOVESofMITHRIL Yes 0x07(悪魔) 0xA0 GLOVESofSILVER Yes 0x0b(魔法生物) 0xA2 MANTIS GLOVES Yes 0x05(昆虫) 0xC0 JUDGEMENT CROSS No 0x06(不死) 0xE3 BOOKofDEMONS No 0x07(悪魔) 0xE8 BLUE PEARL No 0x0b(魔法生物) (最終ダメージ) = (1ヒットダメージ) × (ヒットした回数) (ヒットした回数) = (攻撃回数)回 命中判定を行い、ヒットした数 命中率 味方から敵への命中率は以下のように設定されます まず、敵の AC の設定値のみに依存した一定の確率で 0% となります。 AC 命中率が 0% になる確率 -19以下 100 % -18 1/256 -17〜-16 0 % -15〜 約 1/(AC+17) 上記の判定で命中率が 0% にならなかった場合は、以下のように計算されます (命中率) = max{(AC + (MORLIS 補正) + (DILTO 補正) + (MAMORLIS 補正) + 攻撃者のLV), 1} * 6 + ((STR 補正) + (AGI 補正)) * 5 (MORLIS 補正) = 0 or 4(効いた場合)(※同一呪文の重ねがけは効果なし。以下同様) (DILTO 補正) = 0 or 2 (MAMORLIS 補正) = 0 or 4 (STR 補正) は以下で計算されます STR STR 補正 0〜11 0 12〜14 1 15〜16 2 17 3 18〜 4 (AGI 補正) は以下で計算されます AGI AGI 補正 0〜11 0 12〜14 1 15〜16 2 17 3 18〜 4 補足 max{・, 1} の箇所は ・ が 0 の場合に限り、0 になります。 装備品の ST は参照されていないようです。 装備している武器がレベル制限に引っかかっている場合、命中率を 10% に設定します。また、命中率が 256 % 以上の場合は 100 % にします。 クリティカルヒット率 クリティカルヒット率は以下のように定められています (N*U*M*E*R 除く) 条件 クリティカルヒット率 命中率が 0 % 0% MACEofDEATH を装備している 100% 何も装備していない NINJA の攻撃 約 min{50, LV/4+1} % クリティカル持ち武器を装備していて、LV が 256 以上 約 10 % 同上で、LV が 256 未満の場合 約 (LV/32+1) % ソース ; ; 攻撃計算部分 ; C66E 20 A0 90 JSR $90A0 C671 B0 05 BCS $C678 ; N*U*M*E*R にクリティカルは発動しない C673 20 BD 90 JSR $90BD C676 90 6F BCC $C6E7 ; クリティカル C678 9C E8 C6 STZ $C6E8 C67B A2 09 LDX #$09 C67D 9E 46 2B STZ $2B46,X C680 CA DEX C681 10 FA BPL $C67D ; C683 AD 40 2B LDA $2B40 C686 0A ASL A C687 0A ASL A C688 6D 40 2B ADC $2B40 C68B A8 TAY C68C B9 B6 39 LDA $39B6,Y ; 攻撃回数 C68F C9 01 CMP #$01 C691 F0 0D BEQ $C6A0 C693 48 PHA C694 4A LSR A C695 20 C6 40 JSR $40C6 ; 0〜(攻撃回数/2-1) C698 8D E9 C6 STA $C6E9 C69B 68 PLA C69C 38 SEC C69D ED E9 C6 SBC $C6E9 C6A0 A8 TAY ; 攻撃回数 - (0〜(攻撃回数/2-1)) C6A1 5A PHY C6A2 AD 41 2B LDA $2B41 C6A5 A0 07 LDY #$07 C6A7 20 98 41 JSR $4198 C6AA 85 88 STA $88 ; 基礎ダメージ取得 C6AC 20 40 91 JSR $9140 C6AF 85 88 STA $88 ; 素手忍者の場合 1〜7 に上書きする C6B1 44 37 BSR $C6EA ; 倍打チェック C6B3 B0 07 BCS $C6BC C6B5 06 88 ASL $88 C6B7 A9 02 LDA #$02 C6B9 8D E8 C6 STA $C6E8 C6BC A6 82 LDX $82 C6BE BD 16 39 LDA $3916,X C6C1 4A LSR A C6C2 90 02 BCC $C6C6 C6C4 06 88 ASL $88 C6C6 7A PLY C6C7 5A PHY C6C8 A5 83 LDA $83 ; 命中率 C6CA 20 ED 40 JSR $40ED C6CD B0 13 BCS $C6E2 C6CF EE 46 2B INC $2B46 C6D2 18 CLC C6D3 A5 88 LDA $88 C6D5 6D 4B 2B ADC $2B4B C6D8 8D 4B 2B STA $2B4B C6DB 62 CLA C6DC 6D 4C 2B ADC $2B4C C6DF 8D 4C 2B STA $2B4C C6E2 7A PLY C6E3 88 DEY C6E4 D0 E1 BNE $C6C7 C6E6 38 SEC C6E7 60 RTS ; ; 倍打チェック ; C6EA AD 44 2B LDA $2B44 C6ED 29 7F AND #$7F C6EF A0 0E LDY #$0E C6F1 20 9B 41 JSR $419B C6F4 85 8F STA $8F ; 対象のタイプ C6F6 44 34 BSR $C72C ; 特殊な倍打判定 C6F8 90 ED BCC $C6E7 ; C6FA AD 40 2B LDA $2B40 C6FD 0A ASL A C6FE 0A ASL A C6FF 6D 40 2B ADC $2B40 C702 AA TAX C703 BD B9 39 LDA $39B9,X ; 装備している武器の倍打タイプ C706 C5 8F CMP $8F C708 D0 DC BNE $C6E6 C70A 18 CLC C70B 60 RTS ; ; 特殊な倍打判定 ; C72C 82 CLX C72D DA PHX C72E 8A TXA C72F 0A ASL A C730 0A ASL A C731 AA TAX C732 BD 0C C7 LDA $C70C,X ; 倍打アイテム ID C735 AE 40 2B LDX $2B40 C738 20 8F 41 JSR $418F C73B FA PLX C73C 90 06 BCC $C744 ; 所持している ; C73E E8 INX C73F E0 08 CPX #$08 C741 90 EA BCC $C72D C743 60 RTS C744 E0 05 CPX #$05 C746 B0 11 BCS $C759 ; 6 個目以後は装備不要 C748 DA PHX C749 AE 40 2B LDX $2B40 C74C A9 01 LDA #$01 C74E 20 86 41 JSR $4186 C751 FA PLX C752 29 40 AND #$40 C754 F0 E8 BEQ $C73E C756 8A TXA C757 F0 16 BEQ $C76F ; BLADEofOTAKA C759 8A TXA C75A 0A ASL A C75B 0A ASL A C75C A8 TAY C75D A9 03 LDA #$03 C75F 85 8E STA $8E C761 A5 8F LDA $8F C763 D9 0D C7 CMP $C70D,Y C766 F0 07 BEQ $C76F ; 倍打タイプ一致 C768 C8 INY C769 C6 8E DEC $8E C76B D0 F6 BNE $C763 C76D 80 CF BRA $C73E C76F 18 CLC C770 60 RTS C70C 4C 00 00 00 ; BLADEofOTAKA 61 07 06 0A ; GARBofLORDS 9F 07 00 00 ; GLOVESofMITHRIL A0 0B 00 00 ; GLOVESofSILVER A2 05 00 00 ; MANTIS GLOVES C0 06 00 00 ; JUDGEMENT CROSS E3 07 00 00 ; BOOKofDEMONS E8 0B 00 00 ; BLUE PEARL ; ; 基礎ダメージ ; 68DE 09 00 ORA #$00 68E0 D0 07 BNE $68E9 68E2 A9 02 LDA #$02 68E4 20 76 54 JSR $5476 68E7 1A INC ; 乱数 1〜2 68E8 60 RTS 68E9 A0 0C LDY #$0C 68EB 20 8B 67 JSR $678B 68EE A0 01 LDY #$01 68F0 B1 25 LDA ($25),Y ; B 68F2 20 76 54 JSR $5476 68F5 18 CLC 68F6 72 25 ADC ($25) ; A + 乱数 0〜(B-1) 68F8 60 RTS ; ; クリティカル判定 ; 90BD A5 83 LDA $83 90BF F0 7B BEQ $913C ; 命中率 0 % 90C1 AD 41 2B LDA $2B41 90C4 C9 4B CMP #$4B 90C6 F0 76 BEQ $913E ; MACEofDEATH 90C8 AD 41 2B LDA $2B41 90CB D0 44 BNE $9111 ; 武器を装備しているか 90CD AE 40 2B LDX $2B40 90D0 20 0B 41 JSR $410B 90D3 C9 07 CMP #$07 90D5 D0 65 BNE $913C ; NINJA かどうか 90D7 AE 40 2B LDX $2B40 90DA 20 83 41 JSR $4183 90DD 09 00 ORA #$00 90DF F0 11 BEQ $90F2 ; アイテムを持っていない 90E1 85 70 STA $70 90E3 C2 CLY 90E4 A9 01 LDA #$01 90E6 20 86 41 JSR $4186 90E9 29 40 AND #$40 90EB D0 4F BNE $913C ; 何かを装備している 90ED C8 INY 90EE C4 70 CPY $70 90F0 90 F2 BCC $90E4 90F2 AD 40 2B LDA $2B40 90F5 A2 46 LDX #$46 90F7 A0 2B LDY #$2B 90F9 20 F9 40 JSR $40F9 90FC AD 47 2B LDA $2B47 90FF D0 0C BNE $910D ; LV 上位 8 bit 9101 AD 46 2B LDA $2B46 9104 C9 C8 CMP #$C8 9106 B0 05 BCS $910D ; LV 200 以上 9108 4A LSR A 9109 4A LSR A 910A 1A INC 910B 80 2A BRA $9137 910D A9 32 LDA #$32 910F 80 26 BRA $9137 9111 AD 41 2B LDA $2B41 ; 武器 ID 9114 A0 09 LDY #$09 9116 20 98 41 JSR $4198 9119 90 21 BCC $913C ; クリティカル持ちではない 911B AD 40 2B LDA $2B40 911E A2 46 LDX #$46 9120 A0 2B LDY #$2B 9122 20 F9 40 JSR $40F9 9125 AD 47 2B LDA $2B47 ; LV 上位 8 bit 9128 D0 0B BNE $9135 912A AD 46 2B LDA $2B46 ; LV 下位 8 bit 912D 4A LSR A 912E 4A LSR A 912F 4A LSR A 9130 4A LSR A 9131 4A LSR A 9132 1A INC 9133 80 02 BRA $9137 9135 A9 0A LDA #$0A 9137 20 ED 40 JSR $40ED 913A 90 02 BCC $913E 913C 38 SEC 913D 60 RTS 913E 18 CLC 913F 60 RTS ; ; 忍者の素手ダメージ ; 9140 AE 40 2B LDX $2B40 9143 20 0B 41 JSR $410B 9146 C9 07 CMP #$07 9148 D0 24 BNE $916E ; 忍者以外 914A AE 40 2B LDX $2B40 914D 20 83 41 JSR $4183 9150 09 00 ORA #$00 9152 F0 13 BEQ $9167 9154 8D 71 91 STA $9171 9157 C2 CLY 9158 A9 01 LDA #$01 915A 20 86 41 JSR $4186 915D 29 40 AND #$40 915F D0 0D BNE $916E 9161 C8 INY 9162 CC 71 91 CPY $9171 9165 90 F1 BCC $9158 9167 A9 07 LDA #$07 ; 何も装備してない場合 9169 20 C6 40 JSR $40C6 916C 1A INC ; 乱数 1〜7 916D 60 RTS 916E A5 88 LDA $88 ; 基礎ダメージ 9170 60 RTS ; ; ダメージ計算用などの変数の計算 ; C1CE 82 CLX C1CF 86 80 STX $80 C1D1 8A TXA C1D2 0A ASL A C1D3 0A ASL A C1D4 65 80 ADC $80 C1D6 A8 TAY C1D7 5A PHY C1D8 20 A1 92 JSR $92A1 C1DB 84 80 STY $80 ; 装備 アイテム ID C1DD 7A PLY C1DE 99 B9 39 STA $39B9,Y ; 倍打対象 C1E1 A5 80 LDA $80 C1E3 99 B5 39 STA $39B5,Y ; 装備 アイテム ID C1E6 20 17 92 JSR $9217 C1E9 99 B6 39 STA $39B6,Y ; 攻撃回数 C1EC 20 64 92 JSR $9264 C1EF 99 B7 39 STA $39B7,Y ; 補正値 1 C1F2 20 12 90 JSR $9012 C1F5 99 B8 39 STA $39B8,Y ; 補正値 2 C1F8 E8 INX C1F9 EC 00 38 CPX $3800 C1FC 90 D1 BCC $C1CF ... ; ; 攻撃回数 ; 9217 DA PHX 9218 5A PHY 9219 DA PHX 921A A8 TAY 921B F0 05 BEQ $9222 ; 武器アイテム ID 921D A0 06 LDY #$06 921F 20 98 41 JSR $4198 ; 攻撃回数 9222 85 8F STA $8F 9224 68 PLA 9225 A2 46 LDX #$46 9227 A0 2B LDY #$2B 9229 20 F9 40 JSR $40F9 ; LV 取得 922C A9 05 LDA #$05 922E 8D 48 2B STA $2B48 9231 62 CLA 9232 A2 10 LDX #$10 9234 0E 46 2B ASL $2B46 9237 2E 47 2B ROL $2B47 923A 2A ROL A 923B CD 48 2B CMP $2B48 923E 90 06 BCC $9246 9240 ED 48 2B SBC $2B48 9243 EE 46 2B INC $2B46 9246 CA DEX 9247 D0 EB BNE $9234 9249 8D 49 2B STA $2B49 ; LV / 5 924C A9 16 LDA #$16 924E AE 47 2B LDX $2B47 ; LV / 5 上位 8 bit 9251 D0 0B BNE $925E 9253 AE 46 2B LDX $2B46 ; LV / 5 下位 8 bit 9256 E0 16 CPX #$16 9258 B0 04 BCS $925E 925A 8A TXA 925B D0 01 BNE $925E 925D 1A INC 925E 18 CLC 925F 65 8F ADC $8F ; min{22, max{LV/5, 1}} + 攻撃回数 9261 7A PLY 9262 FA PLX 9263 60 RTS ; ; 武器の倍打取得 ; 92A1 DA PHX 92A2 20 83 41 JSR $4183 92A5 38 SEC 92A6 A8 TAY 92A7 F0 2C BEQ $92D5 ; アイテム個数 == 0 92A9 85 70 STA $70 92AB C2 CLY 92AC 62 CLA 92AD 20 86 41 JSR $4186 92B0 85 71 STA $71 ; アイテム ID 92B2 C9 4D CMP #$4D 92B4 B0 18 BCS $92CE ; 武器以外は無視する 92B6 A9 01 LDA #$01 92B8 20 86 41 JSR $4186 92BB 29 40 AND #$40 92BD F0 0F BEQ $92CE ; 装備していない 92BF A9 02 LDA #$02 92C1 20 86 41 JSR $4186 92C4 A4 71 LDY $71 92C6 38 SEC 92C7 29 0F AND #$0F 92C9 F0 0A BEQ $92D5 ; 倍打なし 92CB 18 CLC 92CC FA PLX 92CD 60 RTS 92CE C8 INY 92CF C4 70 CPY $70 92D1 90 D9 BCC $92AC 92D3 62 CLA 92D4 C2 CLY 92D5 FA PLX 92D6 60 RTS ; ; 命中 ; 973F AD 44 2B LDA $2B44 9742 29 7F AND #$7F 9744 A0 04 LDY #$04 9746 20 9B 41 JSR $419B 9749 A5 28 LDA $28 974B F0 0A BEQ $9757 974D A5 27 LDA $27 ; AC 974F C9 EE CMP #$EE 9751 B0 04 BCS $9757 9753 62 CLA ; AC -18 未満のモンスター 9754 4C 06 98 JMP $9806 9757 18 CLC 9758 A5 27 LDA $27 975A 69 11 ADC #$11 975C 20 C6 40 JSR $40C6 ; 1 / (AC + 17) で命中率を 0 % に設定 975F C9 01 CMP #$01 9761 F0 F0 BEQ $9753 9763 A6 82 LDX $82 9765 BD 16 39 LDA $3916,X 9768 0A ASL A 9769 0A ASL A 976A A8 TAY 976B 90 0D BCC $977A ; モーリス 976D 18 CLC 976E A5 27 LDA $27 9770 69 04 ADC #$04 9772 85 27 STA $27 9774 A5 28 LDA $28 9776 69 00 ADC #$00 9778 85 28 STA $28 977A 98 TYA 977B 0A ASL A 977C 90 0D BCC $978B ; ディルト 977E 18 CLC 977F A5 27 LDA $27 9781 69 02 ADC #$02 9783 85 27 STA $27 9785 A5 28 LDA $28 9787 69 00 ADC #$00 9789 85 28 STA $28 978B AD F9 39 LDA $39F9 ; マモーリス 978E F0 0D BEQ $979D 9790 18 CLC 9791 A5 27 LDA $27 9793 69 04 ADC #$04 9795 85 27 STA $27 9797 A5 28 LDA $28 9799 69 00 ADC #$00 979B 85 28 STA $28 979D AD 40 2B LDA $2B40 97A0 A2 50 LDX #$50 97A2 A0 2B LDY #$2B 97A4 20 F9 40 JSR $40F9 97A7 18 CLC 97A8 AD 50 2B LDA $2B50 97AB 65 27 ADC $27 97AD 8D 50 2B STA $2B50 97B0 AD 51 2B LDA $2B51 97B3 65 28 ADC $28 97B5 8D 51 2B STA $2B51 ; AC + 攻撃者のLV + 補正値 97B8 10 08 BPL $97C2 97BA A9 01 LDA #$01 97BC 8D 50 2B STA $2B50 97BF 9C 51 2B STZ $2B51 ; 負の場合 1 に設定する 97C2 A9 06 LDA #$06 97C4 8D 4B 2B STA $2B4B 97C7 9C 4C 2B STZ $2B4C 97CA 20 21 8B JSR $8B21 ; * 6 97CD AD 40 2B LDA $2B40 97D0 0A ASL A 97D1 0A ASL A 97D2 6D 40 2B ADC $2B40 97D5 A8 TAY 97D6 B9 B7 39 LDA $39B7,Y ; STR/AGI 補正 97D9 18 CLC 97DA 6D 46 2B ADC $2B46 97DD 8D 46 2B STA $2B46 97E0 62 CLA 97E1 6D 47 2B ADC $2B47 97E4 8D 47 2B STA $2B47 97E7 B9 B5 39 LDA $39B5,Y 97EA 8D 41 2B STA $2B41 97ED F0 0D BEQ $97FC 97EF 20 D4 41 JSR $41D4 97F2 90 08 BCC $97FC 97F4 A9 0A LDA #$0A 97F6 8D 46 2B STA $2B46 97F9 9C 47 2B STZ $2B47 97FC AD 46 2B LDA $2B46 97FF AE 47 2B LDX $2B47 9802 F0 02 BEQ $9806 9804 A9 64 LDA #$64 9806 85 83 STA $83 9808 60 RTS ; ; STR/AGI 補正 ; 9264 DA PHX 9265 5A PHY 9266 20 4D 90 JSR $904D ; STR 補正 9269 5A PHY 926A A9 04 LDA #$04 926C 20 17 41 JSR $4117 ; AGI 926F 7A PLY 9270 C9 0C CMP #$0C 9272 90 10 BCC $9284 9274 C8 INY 9275 C9 0F CMP #$0F 9277 90 0B BCC $9284 9279 C8 INY 927A C9 11 CMP #$11 927C 90 06 BCC $9284 927E C8 INY 927F C9 12 CMP #$12 9281 90 01 BCC $9284 9283 C8 INY 9284 84 8E STY $8E 9286 A9 05 LDA #$05 9288 85 8F STA $8F 928A 62 CLA 928B A2 08 LDX #$08 928D 0A ASL A 928E 26 8F ROL $8F 9290 90 07 BCC $9299 9292 18 CLC 9293 65 8E ADC $8E 9295 90 02 BCC $9299 9297 E6 8F INC $8F 9299 CA DEX 929A D0 F1 BNE $928D 929C 85 8E STA $8E 929E 7A PLY 929F FA PLX 92A0 60 RTS ; ; STR 補正 ; 904D A9 00 LDA #$00 904F 20 17 41 JSR $4117 9052 C2 CLY 9053 C9 0C CMP #$0C 9055 90 10 BCC $9067 9057 C8 INY 9058 C9 0F CMP #$0F 905A 90 0B BCC $9067 905C C8 INY 905D C9 11 CMP #$11 905F 90 06 BCC $9067 9061 C8 INY 9062 C9 12 CMP #$12 9064 90 01 BCC $9067 9066 C8 INY 9067 60 RTS 状態異常 / ブレス 状態異常(レベルドレイン含む)の回避・ブレスの半減確率は以下のとおりです 分類 回避(ブレス半減)条件 回避(ブレス半減)率 抵抗あり(抵抗取得バグ注意) (乱数 0〜99) 90 236/256 抵抗なし(Luck 20 未満) (乱数 0〜(21-Luck)) = 1 約 1/(22 - Luck) 抵抗なし(Luck 20 以上) (乱数 0〜(Luck-19)) != 1 約 1 - 1/(Luck - 18) 補足 首刎ねは、上記判定の後に別の回避判定があり、確率 226/256 で無条件で回避できます。 無抵抗の場合であっても、Luck 27 では確率 227/256 で状態異常を回避することができます。 正確な確率 Luck 回避(ブレス半減)率 0 12/256 (4.69 %) 1 13/256 (5.08 %) 2 13/256 (5.08 %) 3 14/256 (5.47 %) 4 15/256 (5.86 %) 5 15/256 (5.86 %) 6 16/256 (6.25 %) 7 17/256 (6.64 %) 8 19/256 (7.42 %) 9 20/256 (7.81 %) 10 22/256 (8.59 %) 11 24/256 (9.38 %) 12 26/256 (10.16 %) 13 29/256 (11.33 %) 14 32/256 (12.50 %) 15 37/256 (14.45 %) 16 43/256 (16.80 %) 17 51/256 (19.92 %) 18 64/256 (25.00 %) 19 85/256 (33.20 %) 20 128/256 (50.00 %) 21 171/256 (66.80 %) 22 192/256 (75.00 %) 23 205/256 (80.08 %) 24 213/256 (83.20 %) 25 219/256 (85.55 %) 26 224/256 (87.50 %) 27 227/256 (88.67 %) 打撃防御・抵抗取得バグ 打撃防御・抵抗を持つアイテムを装備(非装備品については所持)している場合であっても、その抵抗が取得されない場合があります。 具体的には、敵から打撃やブレスなどを受けた際に 抵抗が正しく取得されるのは、最初の装備アイテム もしくは 非装備品までであり、それ以後の(n 番目の)アイテムの抵抗は 別キャラクタの n 番目のアイテムが装備されている もしくは 非装備品である場合にのみ取得されます。 打撃防御・抵抗 と 別キャラクタ との対応は以下の通りです 打撃防御・抵抗 ID 対応する種族・状態異常 対応するキャラクタ 0x00〜0x03 戦士, 魔術師, 僧侶, 動物 前衛 1 番目 0x04〜0x0B 昆虫, 不死, 悪魔, 竜, 巨人, 獣人, 魔法生物, 火 前衛 2 番目 0x0C〜0x13 冷, 毒, ??, 麻, 石, 呪文, 吸, 首 前衛 3 番目 "??" は BASCINET のみに設定されていますが、用途不明です。 アイテムの抵抗能力 で確認できます "呪文" は MANIFO, MONTINO, BADI, MABADI, KATINO の回避率を +20% します。(ダメージ半減効果はありません) 逆にこのバグを利用して、装備していない武器・防具の抵抗を取得することもできます。 ソース 確率周り ; ; 状態異常回避(ブレス半減)判定部分 ; D3F4 AA TAX D3F5 BD EB D3 LDA $D3EB,X D3F8 20 D7 92 JSR $92D7 ; 抵抗の有無確認 D3FB 90 06 BCC $D403 D3FD A9 5A LDA #$5A ; 抵抗がある場合 D3FF 20 ED 40 JSR $40ED ; (乱数 0〜99) 90 ? D402 60 RTS D403 20 0D DE JSR $DE0D ; 抵抗がない場合 D406 60 RTS D3EB 0E 0D 0F 10 13 12 0B 0C 0D ; ; 抵抗がない場合の判定 ; DE0D AE 40 2B LDX $2B40 DE10 A9 05 LDA #$05 DE12 20 17 41 JSR $4117 DE15 8D 3C DE STA $DE3C ; Luck DE18 C9 14 CMP #$14 DE1A 90 0F BCC $DE2B ; ; Luck 20 以上 ; DE1C 38 SEC DE1D AD 3C DE LDA $DE3C DE20 E9 12 SBC #$12 ; Luck - 18 DE22 20 C6 40 JSR $40C6 ; A ← (8 bit 乱数) % (Luck - 18) DE25 C9 01 CMP #$01 DE27 F0 0F BEQ $DE38 DE29 80 0F BRA $DE3A ; ; Luck 20 未満 ; DE2B 38 SEC DE2C A9 16 LDA #$16 DE2E ED 3C DE SBC $DE3C ; 22 - Luck DE31 20 C6 40 JSR $40C6 ; A ← (8 bit 乱数) % (22 - Luck) DE34 C9 01 CMP #$01 DE36 F0 02 BEQ $DE3A DE38 38 SEC DE39 60 RTS DE3A 18 CLC DE3B 60 RTS ; ; 毒 / 麻痺 / 石化 ; D380 A5 83 LDA $83 D382 A0 0B LDY #$0B D384 20 9B 41 JSR $419B D387 AA TAX D388 F0 60 BEQ $D3EA D38A 85 84 STA $84 D38C 29 02 AND #$02 ; 毒持ち確認 D38E F0 1A BEQ $D3AA D390 A9 01 LDA #$01 D392 44 60 BSR $D3F4 D394 90 14 BCC $D3AA ... D3AA A5 84 LDA $84 D3AC 29 04 AND #$04 ; 麻痺持ち確認 D3AE F0 1A BEQ $D3CA D3B0 A9 02 LDA #$02 D3B2 44 40 BSR $D3F4 D3B4 90 14 BCC $D3CA ... D3CA A5 84 LDA $84 D3CC 29 08 AND #$08 ; 石化持ち確認 D3CE F0 1A BEQ $D3EA D3D0 A9 03 LDA #$03 D3D2 44 20 BSR $D3F4 D3D4 90 14 BCC $D3EA ... D3EA 60 RTS ; ; 首刎ね ; D73F A9 04 LDA #$04 D741 20 F4 D3 JSR $D3F4 D744 90 12 BCC $D758 D746 A9 0A LDA #$0A D748 20 ED 40 JSR $40ED ; (乱数 0〜99) 10 ? D74B B0 0B BCS $D758 ; ; レベルドレイン ; D7FD A9 05 LDA #$05 D7FF 20 F4 D3 JSR $D3F4 D802 90 8A BCC $D78E ; ; ブレス ; D8EE 18 CLC D8EF A5 85 LDA $85 D8F1 69 06 ADC #$06 D8F3 20 F4 D3 JSR $D3F4 D8F6 08 PHP D8F7 B0 0C BCS $D905 D8F9 4E 47 2B LSR $2B47 ; ダメージ半減 D8FC 6E 46 2B ROR $2B46 D8FF 4E 51 2B LSR $2B51 D902 6E 50 2B ROR $2B50 ; ; 確率系呪文 ; D516 AD 43 2B LDA $2B43 D519 A0 13 LDY #$13 D51B 20 9B 41 JSR $419B D51E 85 8F STA $8F D520 A9 11 LDA #$11 ; 呪文 抵抗 D522 20 D7 92 JSR $92D7 D525 A5 8F LDA $8F D527 90 03 BCC $D52C D529 18 CLC D52A 69 14 ADC #$14 D52C 4C ED 40 JMP $40ED 打撃防御・抵抗取得 92D7 DA PHX 92D8 85 70 STA $70 92DA AE 40 2B LDX $2B40 ; 対象キャラクタ ID 92DD 20 83 41 JSR $4183 ; キャラクタ X のアイテム個数の取得 92E0 18 CLC 92E1 09 00 ORA #$00 92E3 F0 22 BEQ $9307 92E5 85 71 STA $71 92E7 C2 CLY 92E8 5A PHY 92E9 62 CLA 92EA 20 86 41 JSR $4186 ; キャラクタ X の Y 番目のアイテム ID 取得 92ED 7A PLY 92EE C9 C6 CMP #$C6 92F0 B0 09 BCS $92FB ; 非装備品なら装備不要 92F2 A9 01 LDA #$01 92F4 20 86 41 JSR $4186 ; キャラクタ X の Y 番目のアイテムの装備状態 92F7 29 40 AND #$40 92F9 F0 06 BEQ $9301 92FB A5 70 LDA $70 92FD 44 0A BSR $9309 ; アイテムの抵抗確認(X レジスタが変更される) 92FF B0 06 BCS $9307 9301 C8 INY 9302 C4 71 CPY $71 9304 90 E2 BCC $92E8 9306 18 CLC 9307 FA PLX 9308 60 RTS ; ; 抵抗の確認(注意 X レジスタは破壊される) ; 9309 48 PHA 930A 5A PHY 930B 48 PHA 930C AE 40 2B LDX $2B40 ; 対象キャラクタ ID 930F 62 CLA 9310 20 86 41 JSR $4186 9313 A0 02 LDY #$02 9315 B1 20 LDA ($20),Y 9317 99 7B 20 STA $207B,Y 931A C8 INY 931B C0 05 CPY #$05 931D 90 F6 BCC $9315 931F 68 PLA 9320 18 CLC 9321 69 04 ADC #$04 9323 20 54 40 JSR $4054 9326 38 SEC 9327 35 7D AND $7D,X 9329 D0 01 BNE $932C 932B 18 CLC 932C 7A PLY 932D 68 PLA 932E 60 RTS リセット回数 シナリオクリア時、リセット回数に依存して以下の効果があります リセット回数 効果 0 全呪文習得 使用回数 9 回 1〜9 特性値 MAX 10〜29 EXP +100,000 30〜399 (なし) 400〜499 性格を 善・中立・悪 のいずれかに変更 500〜 年齢 +10 歳 ソース ; ; クリア ; 89D8 AD F2 36 LDA $36F2 89DB 0D F3 36 ORA $36F3 89DE D0 55 BNE $8A35 ; ; リセット回数 0 回 ; 89E0 82 CLX 89E1 DA PHX 89E2 BD 01 38 LDA $3801,X 89E5 AA TAX 89E6 DA PHX 89E7 A0 10 LDY #$10 89E9 20 F0 40 JSR $40F0 89EC A9 99 LDA #$99 89EE C2 CLY 89EF 91 20 STA ($20),Y 89F1 C8 INY 89F2 C0 07 CPY #$07 89F4 90 F9 BCC $89EF 89F6 82 CLX 89F7 BD 27 8A LDA $8A27,X 89FA 91 20 STA ($20),Y 89FC C8 INY 89FD E8 INX 89FE E0 07 CPX #$07 8A00 90 F5 BCC $89F7 8A02 FA PLX 8A03 A0 12 LDY #$12 8A05 20 F0 40 JSR $40F0 8A08 C2 CLY 8A09 A9 99 LDA #$99 8A0B 91 20 STA ($20),Y 8A0D C8 INY 8A0E C0 07 CPY #$07 8A10 90 F9 BCC $8A0B 8A12 82 CLX 8A13 BD 2E 8A LDA $8A2E,X 8A16 91 20 STA ($20),Y 8A18 C8 INY 8A19 E8 INX 8A1A E0 07 CPX #$07 8A1C 90 F5 BCC $8A13 8A1E FA PLX 8A1F E8 INX 8A20 EC 00 38 CPX $3800 8A23 90 BC BCC $89E1 8A25 38 SEC 8A26 60 RTS 8A35 AD F3 36 LDA $36F3 8A38 D0 35 BNE $8A6F 8A3A AD F2 36 LDA $36F2 8A3D C9 0A CMP #$0A 8A3F B0 12 BCS $8A53 ; ; リセット回数 1〜9 ; 8A41 82 CLX 8A42 DA PHX 8A43 BD 01 38 LDA $3801,X 8A46 AA TAX 8A47 20 C0 8A JSR $8AC0 8A4A FA PLX 8A4B E8 INX 8A4C EC 00 38 CPX $3800 8A4F 90 F1 BCC $8A42 8A51 38 SEC 8A52 60 RTS 8A53 C9 1E CMP #$1E 8A55 B0 18 BCS $8A6F 8A57 82 CLX ; ; リセット回数 10〜29 ; 8A58 DA PHX 8A59 8A TXA 8A5A A2 6A LDX #$6A 8A5C A0 8A LDY #$8A 8A5E 20 41 41 JSR $4141 8A61 FA PLX 8A62 E8 INX 8A63 EC 00 38 CPX $3800 8A66 90 F0 BCC $8A58 8A68 38 SEC 8A69 60 RTS 8A6A A0 86 01 00 00 ; ; 30 回 以上 ; 8A6F AD F3 36 LDA $36F3 8A72 F0 0D BEQ $8A81 8A74 C9 01 CMP #$01 8A76 F0 02 BEQ $8A7A 8A78 B0 09 BCS $8A83 8A7A AD F2 36 LDA $36F2 8A7D C9 90 CMP #$90 8A7F B0 02 BCS $8A83 ; ; 30〜399 回 ; 8A81 18 CLC 8A82 60 RTS ; ; 400 回以上 ; 8A83 AD F3 36 LDA $36F3 8A86 C9 01 CMP #$01 8A88 F0 02 BEQ $8A8C 8A8A B0 1C BCS $8AA8 8A8C AD F2 36 LDA $36F2 8A8F C9 F4 CMP #$F4 8A91 B0 15 BCS $8AA8 ; ; 400〜499 回 善/中立/悪をランダムに上書き ; 8A93 82 CLX 8A94 DA PHX 8A95 A9 03 LDA #$03 8A97 20 C6 40 JSR $40C6 8A9A FA PLX 8A9B DA PHX 8A9C 20 0E 41 JSR $410E 8A9F FA PLX 8AA0 E8 INX 8AA1 EC 00 38 CPX $3800 8AA4 90 EE BCC $8A94 8AA6 38 SEC 8AA7 60 RTS ; ; 500回 以上 10 歳加算 ; 8AA8 82 CLX 8AA9 DA PHX 8AAA C2 CLY 8AAB 5A PHY 8AAC A9 01 LDA #$01 8AAE 20 2F 41 JSR $412F 8AB1 7A PLY 8AB2 C8 INY 8AB3 C0 0A CPY #$0A 8AB5 90 F4 BCC $8AAB 8AB7 FA PLX 8AB8 E8 INX 8AB9 EC 00 38 CPX $3800 8ABC 90 EB BCC $8AA9 8ABE 38 SEC 8ABF 60 RTS 8AC0 A0 02 LDY #$02 8AC2 20 F0 40 JSR $40F0 8AC5 C2 CLY 8AC6 B1 20 LDA ($20),Y 8AC8 4A LSR A 8AC9 4A LSR A 8ACA 29 0E AND #$0E 8ACC 8D 18 8B STA $8B18 8ACF 0A ASL A 8AD0 18 CLC 8AD1 6D 18 8B ADC $8B18 8AD4 AA TAX 8AD5 C8 INY 8AD6 BD FA 8A LDA $8AFA,X 8AD9 91 20 STA ($20),Y 8ADB C8 INY 8ADC BD FB 8A LDA $8AFB,X 8ADF 91 20 STA ($20),Y 8AE1 C8 INY 8AE2 BD FC 8A LDA $8AFC,X 8AE5 91 20 STA ($20),Y 8AE7 C8 INY 8AE8 BD FD 8A LDA $8AFD,X 8AEB 91 20 STA ($20),Y 8AED C8 INY 8AEE BD FE 8A LDA $8AFE,X 8AF1 91 20 STA ($20),Y 8AF3 C8 INY 8AF4 BD FF 8A LDA $8AFF,X 8AF7 91 20 STA ($20),Y 8AF9 60 RTS 8AFA 14 14 11 14 14 15 13 16 16 12 15 12 16 13 16 16 11 12 13 13 16 14 16 13 11 13 13 12 16 1B
https://w.atwiki.jp/ohden/pages/492.html
LDAP LDAPクライアントに必要な情報を色々まとめてく ◆参照 http //tools.ietf.org/html/rfc4511 ◆tools phpLDAPadmin http //phpldapadmin.sourceforge.net/wiki/index.php/Main_Page Apache Directory Studio http //directory.apache.org/studio/ ◆用語 LDAP CRL 更新日: 2013年08月23日 (金) 17時27分06秒 名前 コメント すべてのコメントを見る
https://w.atwiki.jp/sampleisbest/pages/623.html
開発環境 Windows 10 Home (64bit) ASM6 ソース dummy.chr fsutil file createNew dummy.chr 8192 spell.asm playingequ$00 seqidxequ$01 tickequ$02 ; iNES header db"NES", $1a db$01; PRG-ROM db$01; CHR-ROM db$00; mapper / mirroring dsb9, $00 base$c000 Reset lda#$00 staplaying lda#$88 sta$2000; PPU制御レジスタ1 lda#$00 sta$2001 - jmp- VBlank ldaplaying bneplay ; Aボタンチェック lda#$01 sta$4016; ジョイパッド1レジスタ lda#$00 sta$4016 lda$4016 and#$01 bne+ rti +; 演奏開始 lda#$01 sta$4015; 音声チャンネル制御レジスタ ;lda#$b8 ;sta$4000; 矩形波CH1制御レジスタ1 lda#$00 sta$4001 lda#$01 staplaying lda#$00 staseqidx lda#$01 statick play dectick beq+ ; duty比変更 ldxtick ldaduty_tbl-1, x sta$4000; 矩形波CH1制御レジスタ1 rti +; シーケンス処理 ldxseqidx ldasequence, x; 音番号 cmp#$ff bne+ ; 演奏終了 lda#$00 sta$4015; 音声チャンネル制御レジスタ lda#$00 staplaying rti + incseqidx sec sbc#72 asl tax ldaduty_tbl sta$4000; 矩形波CH1制御レジスタ1 ldanote_tbl, x sta$4002; 矩形波CH1周波数値レジスタ1 ldanote_tbl+1, x sta$4003 ldxseqidx ldasequence, x; 音長 statick incseqidx rti note_tbl dw$d5, $c9, $bd, $b3, $a9, $9f, $96, $8e, $86, $7e, $77, $70 duty_tbl db$b8, $78, $38, $b8, $78, $38 sequence db72,6, 75,6, 73,6, 76,6, 74,6, 77,6, 78,6, $ff org$fffa dwVBlank; NMI VBlank dwReset dw0; IRQ/BRK incbin"dummy.chr" build.bat @echo off path C \etc\asm6;%path% set filename=spell asm6 %filename%.asm %filename%.nes if errorlevel 1 goto ERROR C \etc\nj051b_ja\nesterJ.exe %filename%.nes goto END ERROR pause END